2016-11-17 49 views
0

當前正在嘗試爲複雜系統編寫單元測試,該系統在其方法之一中使用構造函數,該方法將自身作爲參數注入數據庫上下文並檢索正確的對象來自正確的環境。Mockito,在類的方法內嘲笑構造函數

試圖使用Mockito來模擬這個,並使其返回一個測試對象,而不是試圖從數據庫中找到它;但我很難理解如何使它與傳統技術和@InjectMocks + @Mock註解一起工作。

代碼的本質是如下:

public FooService{ 

public String fooFindObject(FooDefinition fooDef) throws FooDefinitionException{ 

FooFinder theFooFinders = new FooFinder(this); 
Foo fooObj = theFooFinders.findFoo(fooDef); 

//Logic to be tested inside here that will throw exception upon bad foo definitions 

return fooObj.trackingId(); 

} 

我怎麼能嘲笑這個FooFinder對象,並使其回到我自己的測試Foo對象,所以我可以測試定義OBJ。正在使用Mockito,並且不允許重寫此代碼以使用FooFinder obj的get/setter - 這不是我的代碼,我只是在那裏測試它。

+0

你被明確要求JVM創建'FooFinder'實例。你不能嘲笑它。如果我是你,我可以修改我的代碼,這樣'FooFinder theFooFinders'是一個字段。對於應用程序,我肯定會使用DI框架或最壞的情況,我會從不同的類中設置它。 – NewUser

+0

我同意,使用DI併爲它提供一個模擬對象會容易得多,而且如果我找不到解決方案,我最終可能會推出代碼提交來實現。 –

+0

提高可測性的推動不應該成爲任何人的問題。我不確定你的限制,但給它一個鏡頭。 – NewUser

回答

0

有一個庫擴展了Mockito:PowerMockito。

它可以讓你做比一般Mockito更多的黑客攻擊。這非常可愛,但事實是,如果你需要PowerMockito,你的設計通常會聞到氣味。

我會定義重構你的設計。但是,如果你不能以任何理由這樣做,請看看構造函數PowerMockito嘲諷:

http://benkiefer.com/blog/2013/04/23/powermockito-constructor-mocking/

+0

我在InjectMock和Mock註釋的問題中提到了PowerMockito,它迄今爲止對我沒有任何幫助。我會欣賞一些示例代碼。 –

+0

你的問題只提到mockito實現。示例代碼可以在我的答案的URL中找到? –