模拟方法的Mockito调用实际方法

时间:2017-07-15 16:14:11

标签: java junit mockito

我正在尝试使用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(模拟)。 对此有任何帮助表示赞赏。

2 个答案:

答案 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有一节与此有关。请参阅“ 监视真实对象的重要提示!”下的部分