【问题标题】:Mockito spy method being called during unit test在单元测试期间调用 Mockito 间谍方法
【发布时间】:2021-08-08 00:26:16
【问题描述】:

我遇到了我无法理解的 Mockito.spy 行为。我正在监视对象实例的方法,并且该方法正在返回预期的结果。然而,被监视的方法实际上正在被调用。为什么会这样?不应该完全跳过该方法,只返回 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;
    }
}

测试类,测试通过

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调用”

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

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

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

    stackoverflow 推荐了这个,它解决了我的问题: 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()

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多