Mockito 模拟方法调用实际方法

use*_*993 12 java junit mockito

我正在尝试createInstanceB()使用Mockito.when()以及模拟方法doReturn()模拟方法。这总是调用真实方法。

例如:

Class A {
  public B createInstanceB(any, any) {
    B b = new B();
    b.api();
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的代码

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);
        ...
      }
    }
Run Code Online (Sandbox Code Playgroud)

doReturn(mock)也尝试过。

And*_*dyB 18

正如 StvnBrkdll 建议的那样,如果您需要使用实际实例,请使用 Spy。但如果像示例中那样使用 Mockito.when() ,有时仍然可以调用真正的方法。作为替代方案,请查看 Mockito.doReturn()。例如使用您的代码:Mockito.doReturn(b).when(a).createInstanceB(any(),any());这现在只会返回b并且永远不会调用 的实际方法createInstanceB

顺便说一句,他们的文档有一个关于此的部分。请参阅“有关监视真实对象的重要陷阱! ”下的部分


Stv*_*dll 6

代码的问题在于它调用的是Mockito.when()的实际实例A,而不是模拟。Mockito.when()只适用于模拟对象,不适用于真实对象。

如果您需要在“真实”对象上“模拟”(存根)方法,请考虑使用Mockito.spy(). 有关使用“间谍”的更多信息,请参阅这篇文章

像这样的东西将接近你想要的:

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);
 ...
}
Run Code Online (Sandbox Code Playgroud)

您需要在测试代码中使用aSpy, 而不是。a