【问题标题】:Nested mocked method is not getting called in Mockito在 Mockito 中未调用嵌套的模拟方法
【发布时间】: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


【解决方案1】:

您能否建议如何实施这种我认为很常见的场景

正如@JoeC 所写,这不是常见的场景。

原因是:您测试 Mockito 的行为,但您应该测试 您的代码 行为。

为了做到这一点,您在不模拟它的情况下实例化您的被测代码,并为它的依赖项传入模拟。

【讨论】:

  • 从技术上讲,可能有人会争辩说 method3 实际上只是一个隐藏的依赖项,因此考虑将其重构为显式依赖项可能是个好主意。
  • @FlorianSchaetz:“有人可能会说 method3 实际上只是一个隐藏的依赖项” 我认为您的假设是基于 OP 希望模拟该方法调用,但就我看到这只是疯狂的猜测。也许她通过测试实现细节以错误的方式进行单元测试。但是是的:如果方法 3 隐藏了对依赖项的访问,则应该对其进行重构。
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多