在Mockito中没有调用嵌套的模拟方法

时间:2017-11-15 07:19:28

标签: 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() {

      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属性。

1 个答案:

答案 0 :(得分:0)

  

你能否建议如何实施我认为非常常见的情况

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

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

为了做到这一点,你要在测试下实例化你的代码,而不是嘲笑它,并为其依赖项传递模拟。