[英]Why Cannot I use Mock and InjectMocks together?
有效构造:
@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());
}
}
听起来您正在尝试做一些没有实际意义的事情。 您不需要将任何依赖项注入到您的模拟中,因为按定义进行模拟不会有任何行为,除非您使用when(mock.someMethod()).thenAnswer()
或某些变体对其进行定义。
(除非您使用的是spy()
,但您特别声明您使用的是@Mock
)。
也许您可以解释您的用例,以及为什么要尝试将依赖项注入到模拟中?
@InjectMocks
专门指示带注释的字段将不包含模拟。 注释@InjectMocks @Mock
不仅不受支持,而且是矛盾的。
要尽可能返回存根 ,请使用以下命令:
@Mock(answer=Answers.RETURNS_DEEP_STUBS)
YourClass mockYourClassWithDeepStubs;
但是请注意此答案的官方文档 :
警告:常规清洁代码很少需要使用此功能! 留给旧代码。 模拟一个模拟返回一个模拟,返回一个模拟,(...),返回一些有意义的提示,以违反违反Demeter法则或模拟一个值对象(众所周知的反模式)。
我在网上看到过的好报价: 每次模拟返回模拟时,仙女都会死去 。
模拟没有任何实际的实现。 @InjectMocks
会尝试查找并调用已创建的模拟对象并将其传递给setter。Mockito“知道”这对模拟来说毫无意义,因为没有任何方法可以将模拟对象撤回。 ,更不用说对他们有意义的事情了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.