【发布时间】:2012-10-31 18:19:22
【问题描述】:
我正在测试一个 void 方法,它恰好调用了一个类中的其他几个 void 方法(所有这些方法都在同一个类中)。方法就是这样的……
public void methodToTest() {
methodA();
methodB();
}
void methodA() {
methodA1();
methodA2();
methodA3();
}
我想做的是让上面的methodA() 什么都不做。也就是我希望methodA()基本上是这样的:
void methodA() { }
我在methodA() 上尝试了doThrow() 和doAnswer() 均无济于事。就好像这两个都被完全忽略了。
我尝试过的一个例子......
doThrow(new RuntimeException()).when(mockedClass).methodA();
有没有办法只使用 Mockito 来做到这一点?我无权更改正在修改的类。
【问题讨论】:
-
这应该可以,你确定
methodA不是final吗? -
methodA不是final -
回顾你的 sn-p 看起来你想做一个部分模拟,可能只执行
methodB,而你正在执行methodA。你肯定在使用mock(YourObject.class),那么当然mock什么都不做,而且肯定永远不会执行真正的代码。您可以实现您想要的spy(YourObject.class),它将默认执行真实代码。但是,部分模拟被认为是测试气味,如果不是设计气味,您应该寻找机会将methodA的行为作为可以在 API 中公开为AStrategy的依赖项。 -
可能你理解了上一个问题的含义,但是类本身不能是final的,或者方法是final的,即使修饰符没有在方法上显式声明。所以这门课也不是final的?
-
到目前为止还没有指出的一点是,一般来说,模拟被测类并不是好的做法。如果您需要在
methodA没有副作用的情况下进行测试,请模拟methodA调用的对象以达到预期结果。