Java Mockito中未调用嵌套的模拟方法
让我们假设我有这个简单的场景Java Mockito中未调用嵌套的模拟方法,java,unit-testing,mockito,Java,Unit Testing,Mockito,让我们假设我有这个简单的场景 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() { TestMo
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文件应用了MockMaker内联属性 你能建议如何实现这种我认为非常常见的场景吗 正如@JoeC所写,这不是一个常见的场景 原因是:您测试Mockito的行为,但您应该测试代码的行为 为了做到这一点,您可以在不模拟的情况下实例化测试中的代码,并为其依赖项传递模拟 你能建议如何实现这种我认为非常常见的场景吗 正如@JoeC所写,这不是一个常见的场景 原因是:您测试Mockito的行为,但您应该测试代码的行为
为了做到这一点,您可以在不进行模拟的情况下实例化测试中的代码,并为其依赖项传递模拟。我认为这根本不是一个常见的场景(至少我从未见过)。你认为你为什么要这样做?你的实际代码似乎还可以。你确定你真的运行了你在这里发布的代码吗?@davidxxx是的,绝对肯定。我使用的是Mockito V2.12,我刚刚用Mockito 1.9.5测试过,它可以工作。也许Mockito2.12有些不同。我会试试看。@JoeC说,你有一个类,你想测试,这个类有一个(多个)getter返回对象,在构造函数中创建,你不能在测试基础设施中实例化,比如DB/network access,相反,你想让这些getter返回一些存根。我不认为这是一个常见的场景(至少我从未见过)。你认为你为什么要这样做?你的实际代码似乎还可以。你确定你真的运行了你在这里发布的代码吗?@davidxxx是的,绝对肯定。我使用的是Mockito v 2.12。我刚刚用Mockito 1.9.5测试过,它很有效。也许Mockito 2.12中有些不同。我会尝试。@JoeC说,你有一个类,你想测试,这个类已经完成了一(多)个吸气剂返回在构造函数中创建的对象,这些对象不能在测试基础设施中实例化,例如DB/network access,相反,您希望这些getter返回一些存根。从技术上讲,有人可能会认为method3实际上只是一个隐藏的依赖项,因此考虑将其重构为显式依赖项可能是一个好主意。@FlorianSchaetz:“有人可能会说method3实际上只是一个隐藏的依赖项”我认为你的假设是基于OP希望模拟该方法调用,但就我看来,这只是胡乱猜测。也许她通过测试实现细节以错误的方式进行单元测试。但是,是的:如果方法3隐藏了对依赖项的访问,那么应该对其进行重构。从技术上讲,有人可能认为方法3实际上只是一个隐藏的dependency,因此考虑将其重构为显式依赖可能是个好主意。@FlorianSchaetz:“有人可能会说method3实际上只是一个隐藏的依赖项。”我认为您的假设是基于OP希望模拟该方法调用,但就我看来,这只是胡乱猜测。也许她通过测试实现细节以错误的方式进行单元测试。但是,是的:如果方法3隐藏了对依赖项的访问,那么应该重构它。