同一类中的模拟方法

新手上路,请多包涵

我正在使用 Mockito 模拟我正在为其编写测试的同一类中的方法。我在 SO( 同一类中的模拟方法)上看到了其他答案,但可能我误解了它们,因为我遇到了问题。

  class Temp() {

    public boolean methodA(String param) {

         try {

             if(methodB(param))
                   return true;

             return false;
         } catch (Exception e) {
               e.printStackTrace();
         }
    }
 }

我的测试方法:

  @Test
 public void testMethodA() {

    Temp temp = new Temp();
    Temp spyTemp = Mockito.spy(temp);

    Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any());
    boolean status = temp.methodA("XYZ");

    Assert.assertEquals(true, status);
 }

然而,我打印出了预期,因为 methodB 的定义被执行了。我的理解是 methodB 的定义会被使用 spyTemp 嘲笑。然而,情况似乎并非如此。

有人可以解释我哪里出错了吗?

原文由 alwaysAStudent 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 597
2 个回答

第一个问题是您必须使用 spyTemp 对象来期望 Mockito 提供一些东西。这里和test不一样。 spyTemp 被 Mockito 对象包装 temp

另一个问题是您仅存 methodB() ,但您正在尝试运行 methodA() 。是的,在您执行 methodA() 时,您调用了 methodB(),但您调用 this.methodB() ,而不是 spyTemp.methodB() 。在这里你必须明白,只有当你在 temp 的实例上调用它时,模拟才会起作用。它由捕获您的调用的 Mockito 代理包装,如果您重写了某些方法,它将调用您的新实现而不是原始实现。但是由于调用了原始方法,因此您在其中对 Mockito 代理一无所知。所以你的“覆盖”方法只会在你运行时被调用 spyTemp.methodB()

这应该工作:

 Mockito.doReturn(true).when(spyTemp).methodB(Mockito.any());
boolean status = spyTemp.methodA("XYZ");

原文由 Konstantin Labun 发布,翻译遵循 CC BY-SA 4.0 许可协议

你创建了一个间谍并嘲笑了 methodB() 。那是对的!但是您在原始对象上调用了 methodA() 。要获得正确的结果,请在间谍上调用它

boolean status = spyTemp.methodA("XYZ");

原文由 CoronA 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题