有效建设:
@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());
}
}
答案 0 :(得分:2)
听起来你正在尝试做一些没有意义的事情。您不应该需要将任何依赖项注入到模拟中,因为根据定义,mocks在您使用when(mock.someMethod()).thenAnswer()
或某些变体进行定义之前不会有任何行为。
(除非您使用的是spy()
,但您明确表示您使用的是@Mock
)。
也许您可以解释一下您的用例以及为什么要尝试将依赖项注入模拟?
答案 1 :(得分:1)
@InjectMocks
明确指出带注释的字段不包含模拟。注释@InjectMocks @Mock
不仅不受支持 - 它是矛盾的。
要return stubs wherever possible,请使用:
@Mock(answer=Answers.RETURNS_DEEP_STUBS)
YourClass mockYourClassWithDeepStubs;
但是注意the official documentation for this Answer:
警告:常规清洁代码很少需要此功能!留下遗留代码。嘲笑一个模拟器来返回一个模拟器,返回一个模拟器,(...),返回违反Demeter法则的一些有意义的提示或者模拟一个值对象(一个众所周知的反模式)。
好的引用我在网上看到了一天:每次模拟返回模拟时,一个仙女死去。
答案 2 :(得分:0)
模拟没有任何真正的实现。 @InjectMocks
会尝试找到并调用setter来处理已经创建的任何模拟对象并将其传入.Mockito“知道”这在模拟上有点无意义,因为没有任何方法可以获得模拟对象退出,更不用说对它们有意义了。