多级@Mock和@InjectMocks

Col*_*ers 31 java mockito

所以我理解在Mockito @InjectMocks中会注入@Mock的注释,但是如何处理这种情况呢?

@Mock
private MockObject1 mockObject1;

@Mock
private MockObject2 mockObject2;

@InjectMocks
private SystemUnderTest systemUnderTest = new SystemUnderTest();
Run Code Online (Sandbox Code Playgroud)

想象一下,MockObject2的属性类型为MockObject1,而SystemUnderTest的属性类型为MockObject2.我想将mockObject1注入mockObject2,并将mockObject2注入systemUnderTest.

这可能带注释吗?

Col*_*ers 25

由于我在这里没有得到任何回复,我在Mockito论坛上提出了问题.以下是讨论的链接:https://groups.google.com/d/topic/mockito/hWwcI5UHFi0/discussion

总结一下这些答案,从技术上来说,这会破坏嘲弄的目的.您应该只模拟SystemUnderTest类所需的对象.在自己模拟的对象中嘲弄东西是没有意义的.

如果你真的想这样做,@ spy可以提供帮助

  • 是的,它不适合使用模拟的*unit*测试,但是这个功能(一直注入依赖关系)对于*integration*测试非常有用.我目前正在为自己的模拟工具包JMockit工作. (7认同)

Mat*_*ttC 18

将@Spy与@InjectMocks结合起来是可能的.对于你的例子,它将是:

@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;
Run Code Online (Sandbox Code Playgroud)

  • 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 (4认同)

z1l*_*V3r 5

我发现的其他解决方案是使用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;
Run Code Online (Sandbox Code Playgroud)