【发布时间】:2018-04-28 07:55:45
【问题描述】:
假设我有这个简单的场景。
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 属性。
【问题讨论】:
-
我认为这根本不是一个常见的场景(至少我从未见过)。你认为你为什么要这样做?
-
您的实际代码似乎没问题。你确定你真的运行了你在这里发布的代码吗?
-
@davidxxx 是的,绝对确定。我正在使用 Mockito v 2.12
-
我刚刚用 Mockito 1.9.5 进行了测试,它可以工作。在 Mockito 2.12 中可能有所不同。我会试试的。
-
@JoeC 说,你有一个类,你想测试,这个类有一个(多个)getter(s)返回对象,在构造函数中创建,你不能在测试基础设施中实例化,例如数据库/网络访问,而您希望这些 getter 返回一些存根。
标签: java unit-testing mockito