我正在尝试使用Mockito.when和doReturn()模拟方法createInstanceB。这总是称为真正的方法。 例如:
Class A{
public B createInstanceB(any,any){
B b= new B();
b.api();
}
}
我在下面使用我的进口产品 import org.mockito.Mockito; import static org.mockito.Mockito。*;
Class ATest{
A a ;
B b;
@Before
Public void setup{
a= A.getInstance();
b= mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(a.createInstanceB(any(),any()).thenreturn(b);
...
}
尝试了doReturn(模拟)。 对此有任何帮助表示赞赏。
答案 0 :(得分:2)
代码的问题在于它在A
的实际实例上调用Mockito.when(),而不是模拟。 Mockito.when()只适用于模拟对象,而不是真实的东西。
如果您需要在“真实”对象上“模拟”(存根)方法,请考虑使用Mockito.spy()。有关使用“间谍”的更多信息,请see this post。
这样的东西将接近你想要的东西:
Class ATest{
A a ;
A aSpy;
B b;
@Before
Public void setup{
a= A.getInstance();
aSpy = Mockito.spy(a);
b= mock(B.class);
}
@Test
public void testCreateInstanceB(){
Mockito.when(aSpy.createInstanceB(any(),any()).thenreturn(b);
...
}
您需要在测试代码中使用aSpy
,而不是a
。
答案 1 :(得分:0)
按照StvnBrkdll的建议,如果需要使用实际实例,请使用间谍程序。但是,即使您在示例中使用Mockito.when(),有时仍可以调用real方法。或者,查看Mockito.doReturn()。例如,使用您的代码:Mockito.doReturn(b).when(a).createInstanceB(any(),any());
现在将仅返回b
,而从不调用createInstanceB
的实际方法。
顺便说一句,their docs有一节与此有关。请参阅“ 监视真实对象的重要提示!”下的部分