2011-06-09 29 views
22

所以我明白,在Mockito @InjectMocks會注入任何它可以與@Mock的註釋,但如何處理這種情況?@Mock和@InjectMocks的多個級別

@Mock 
private MockObject1 mockObject1; 

@Mock 
private MockObject2 mockObject2; 

@InjectMocks 
private SystemUnderTest systemUnderTest = new SystemUnderTest(); 

試想MockObject2具有的類型是MockObject1的屬性,和具有SystemUnderTest類型MockObject2的屬性。我想將mockObject1注入到mockObject2中,並將mockObject2注入到systemUnderTest中。

這是可能與註釋?

回答

20

因爲我沒有得到任何答覆,所以我問Mockito論壇。這裏是討論的鏈接:https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

總而言之,從技術上來說,這樣做可能會打敗嘲笑的目的。你應該只是模擬SystemUnderTest類所需的對象。嘲笑自己嘲笑的東西內的東西是沒有意義的。

如果你真的想這樣做,@spy可以幫助

+3

是的,它不適用於使用模擬的* unit *測試,但是此功能(注入依賴關係)對於* integration *測試非常有用。我目前正在爲我自己的嘲笑工具包JMockit開展工作。 – 2014-07-25 17:41:44

2

這對我的作品:由@Spy與@InjectMocks結合

private MockObject1 mockObject1 = mock(MockObject1.class); 

@Spy 
private RealObject2 realObject = new RealObject2(mockObject1); 

@InjectMocks 
private SystemUnderTest systemUnderTest = new SystemUnderTest(); 
10

這是可能的。對於你的例子,它會是:

@Spy 
private MockObject1 mockObject1 = new MockObject1(); 

@Spy @InjectMocks //if MockObject2 has a MockObject1, then it will be injected here. 
private MockObject2 mockObject2 = new MockObject2(); 

@InjectMocks 
private SystemUnderTest systemUnderTest; 
+0

這不再鼓勵與mockito2:http://stackoverflow.com/questions/38567326/is-it-discouraged-to-use-spy-and-injectmocks-on-the-same-field 和 https:/ /github.com/mockito/mockito/issues/169 – 2017-01-12 09:22:59

3

我發現其他解決方案是使用java sintax代替註釋來使@Spy對象注入。

@Spy 
private MockObject1 mockObject1 = new MockObject1(); 

@InjectMocks //if MockObject2 has a MockObject1, then it will be injected here. 
private MockObject2 mockObject2 = spy(MockObject2.class); 

@InjectMocks 
private SystemUnderTest systemUnderTest;