2013-01-31 74 views
3

使用的Mockito我想嘲弄一個類的屬性,所以我可以驗證輸出如何嘲笑的第三方代碼保護的方法

public class MyClass extends ThirdPartyFramework { 
    Output goesHere; 

    @Override 
    protected setup(){ 
    goesHere = new Output(); 
    } 

    //...  
} 

public abstract class ThirdPartyFramework { 
    protected setup(){...} 
    //... 
} 

我需要注入輸出類的模擬這樣我就可以驗證我的代碼編寫了正確的輸出。

  • 但我不能只@InjectMock因爲setup()方法被稱爲 中期運行並覆蓋我注射。

  • 我不能只是讓公衆建立在MyClass因爲測試代碼我工作 是通用的,需要爲 ThirdPartyFramework所有子類的工作,所以我只有一個參考ThirdPartyFramework,這意味着setup()受到保護。

回答

1

我最終通過纏繞ThirdPartyFramework,並把這個類在同一個包中ThirdPartyFramework類解決這個。

這樣我就可以用Mockito來嘲笑受保護的方法。然後,我可以使用@InjectMock來注入對象的模擬,並通過該模擬來控制其方法調用。

+1

+1我正準備自己提供這些答案。總是將你的第三方庫包裝成你可以以你需要的方式實際模擬的東西。 –

0

如何爲「goesHere」添加一個setter,然後進行setup()檢查,並且只有當其爲null時才更改goesHere的值。這樣你可以在測試中注入一個不會被覆蓋的值。例如:

protected void setGoesHere(Output output){ 
    goesHere = output; 
} 

@Override 
protected void setup(){ 
    if(goesHere != null) goesHere = new Output(); 
} 

希望這會有所幫助。

+0

這將工作,但不幸的是我正在做一個測試框架的工作,所以我不直接控制MyClass,我不能依靠重構MyClass來解決問題。 –

1

您是否設置了Mockito?我詢問自Mockito FAQ Mockito FAQ指出它不支持嘲弄靜態方法,我猜你在這種情況下需要使用setup方法來創建你的模擬而不是實際的輸出。

我已經使用PowerMock了類似的情況:

whenNew(NewInstanceClass.class).withArguments(any()).thenReturn(mockObject); 

它說,每次NewInstanceClass被創建我mockObject沒有返回此事已使用什麼構造函數參數和誰在什麼時候建造NewInstanceClass。

在PowerMock文檔我也發現下面的例子:

PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject) 

其實你可以使用它,即使你被綁定到的Mockito,PowerMock contains helpers for Mockito正好解決了這個問題,讓你用對的Mockito所有測試和PowerMock模擬構建對象。就像這樣:

whenNew(Output.class).withNoArguments().thenReturn(yourOutputMock); 
+0

這很好,我可能不得不這樣做,添加PowerMock的依賴關係是一項工作,但覆蓋新運算符的能力會使這個問題變得微不足道。 –