有效构造:
@InjectMocks
SomeClass sc = mock(SomeClass.class);
无效建设:
@InjectMocks
@Mock
SomeClass sc;
我想把模拟注入到另一个模拟中。我只想使用注释样式。
为什么Mockito禁止二次构造?
更新例子:
public class ArrTest {
private SomeClass someClass;
public List<String> foo(){
anotherMethod(); // I suppose that this method works. I want to test it separately.
//logic which I need to test
return someClass.doSmth();// I suppose that this method works. I want to test it separately.
}
public void anotherMethod(){
///...
}
}
public class SomeClass {
public List<String> doSmth(){
return null;
}
}
测试:
public class ArrTestTest {
@InjectMocks
ArrTest arrTest = Mockito.mock(ArrTest.class);
@Mock
SomeClass someClass;
@Test
public void fooTest(){
Mockito.when(someClass.doSmth()).thenReturn(new ArrayList<String>());
Mockito.doNothing().when(arrTest).anotherMethod();
System.out.println(arrTest.foo());
}
}
听起来你在做一些没有意义的事情。您不应该需要向mock注入任何依赖,因为mock在定义上没有任何行为,直到您使用when(mock.someMethod()).thenAnswer()
或一些变体定义它。
(除非您正在使用spy()
,但您已经明确表示您正在使用@Mock
)。
也许你可以解释你的用例和为什么你试图注入依赖到模拟?
@InjectMocks
明确表示注释字段将不包含模拟。注释@InjectMocks @Mock
不仅是不支持的,而且是矛盾的。
在可能的情况下返回存根,使用:
@Mock(answer=Answers.RETURNS_DEEP_STUBS)
YourClass mockYourClassWithDeepStubs;
但是要注意这个答案的官方文档:
警告:对于常规的干净代码,很少需要此特性!把它留给遗留代码。模拟一个mock来返回一个mock,返回一个mock,(…),返回一些有意义的东西,暗示违反了Demeter法则或模拟一个值对象(一种众所周知的反模式)。
有一天我在网上看到了一个很好的引用:每当一个mock返回一个mock,一个fairy就会死去。
mock没有任何真正的实现。@InjectMocks
将尝试查找并调用已经创建的任何模拟对象的setter,并将它们传递进去。Mockito"知道"这在模拟中是毫无意义的,因为没有任何方法可以将模拟对象取出来,更不用说对它们做任何有意义的事情了。