假设我有这个简单的场景。
package kivoxdaemon.utils;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class TempTest {
@Test
public void test() {
TestMock testMock = Mockito.mock(TestMock.class);
Mockito.doCallRealMethod().when(testMock).method1();
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
System.out.println("Mock method3");
return null;
}
}).when(testMock).method3();
testMock.method1();
}
}
class TestMock {
void method1() {
System.out.println("method1");
method2();
}
private void method2() {
System.out.println("method2");
method3();
}
void method3() {
System.out.println("method3");
}
}
此代码在控制台中具有以下输出:
方法1
方法2
方法3
而我希望它是
方法1
方法2
模拟方法3
方法 3 被嘲笑了,那么为什么它没有被调用呢?
您能否建议如何实现这种我认为非常常见的场景,当调用链从真正的公共方法开始,但必须嘲笑内部调用的其他一些方法时?
提前谢谢你。
UPD:刚刚发现这是因为通过org.mockito.plugins.MockMaker文件应用的mock-maker-inline属性。
您能否建议如何实现这种我相信非常常见的情况
正如@JoeC所写,这不是一个常见的场景。
原因是:你测试了Mockito的行为,但你应该测试你的代码行为。
为此,您需要实例化待测试的代码而不模拟它,并为其依赖项传递模拟。