在单元测试期间调用 Mockito 间谍方法

Mockito spy method being called during unit test

我遇到了一个我无法理解的 Mockito.spy 行为。我正在监视一个对象实例的方法,该方法是 return 预期的结果。然而,被监视的方法实际上正在被调用。为什么会这样?不应该完全跳过该方法而只 return thenReturn 值吗?

这是我解释行为的示例代码:

public class MockitoSample {
    public boolean methodA() {
        return methodB("a","b");
    }
    public boolean methodB(String a, String b) { //method I want to mock
        System.out.println("B called"); //why is this being called?
        return false;
    }
}

测试class,测试会通过

public class MockitoTest {
    
    @Test
    public void mockMethodB() {
        MockitoSample sampleInstance= new MockitoSample();
        MockitoSample sampleSpy = Mockito.spy(sampleInstance);
        Mockito.when(sampleSpy.methodB(Mockito.any(String.class),Mockito.any(String.class))).thenReturn(true);

        assertTrue(sampleSpy.methodA());  //passes as method B will return true now.
    }
}

基本上这一行实际上会调用真正的方法和系统输出“B called”

Mockito.when(sampleSpy.methodB(Mockito.any(String.class),Mockito.any(String.class))).thenReturn(true);

为什么会这样?显然,这是一个示例并在此处传递,但是如果我有一个要模拟的 methodB 的完整实现怎么办?

Whosebug 将此推荐为相关内容,它解决了我的问题: Mockito: Trying to spy on method is calling the original method

基本上,使用 doReturn 而不是 when。

Mockito.doReturn(true).when(sampleSpy).methodB(Mockito.any(String.class),Mockito.any(String.class));

同样有帮助的回复:Mockito - difference between doReturn() and when()