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隐藏了对依赖项的访问,那么应该重构它。