我正在使用 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 许可协议
第一个问题是您必须使用 spyTemp 对象来期望 Mockito 提供一些东西。这里和test不一样。
spyTemp
被 Mockito 对象包装temp
。另一个问题是您仅存
methodB()
,但您正在尝试运行methodA()
。是的,在您执行methodA()
时,您调用了 methodB(),但您调用this.methodB()
,而不是spyTemp.methodB()
。在这里你必须明白,只有当你在temp
的实例上调用它时,模拟才会起作用。它由捕获您的调用的 Mockito 代理包装,如果您重写了某些方法,它将调用您的新实现而不是原始实现。但是由于调用了原始方法,因此您在其中对 Mockito 代理一无所知。所以你的“覆盖”方法只会在你运行时被调用spyTemp.methodB()
这应该工作: