【发布时间】: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