PowerMockito:模拟私有方法来抛出私有类



我有一个看起来像这样的类:

public class Foo {
public meth() {
try {
privMethod();
System.out.println("Yay!");
} catch (FooException e) {
System.out.println("Boo!");
}
}
private void privMethod() throws FooException {
//doOtherStuff
if (someCondition()) {
throw new FooException();
}
}
private class FooException extends Exception {
FooException(String message) { super(message); }
}
}

我想为此编写一个单元测试,使用Mockito和Powermock。 我知道我可以像这样嘲笑私有方法:

Foo spy = PowerMockito.spy(new Foo())
PowerMockito.doNothing().when(spy, "privMethod");

但是我如何告诉它抛出异常呢?我知道它会是这样的:

Powermockito.doThrow(/*what goes here?*/).when(spy, "privMethod");

那里有什么?

请注意,例外是一个私有内部类,所以我不能只做doThrow(new FooException()),因为FooException无法从单元测试访问。

一般来说,你去。

Powermockito.doThrow(theThingToThrow)

去那里。比如doThrow(new RuntimeException("should be thrown"))。或者更具体的异常,具体取决于您希望受测代码对异常执行的操作。

但是,当然:您希望在那里实例化一个私有类。这是你做不到的(很容易,请参阅此处了解非常复杂的方法(。从这个角度来看:你创建了一个非常难以测试的设计。答案是重新设计该设计,使其更容易测试。

最后一句警告:我认为你不应该为此使用PowerMockito。间谍与普通的莫基托一起工作。

当没有硬性需要使用PowerMock(ito(版本时,请不要使用它们。时期。他们有自己的位置,但老实说:大多数情况下,需要PowerMock(ito(等于"难以测试的代码"。

除此之外:查看私有方法意味着测试实现细节。这也是尽可能避免的事情。

因此,换句话说:A(以有意义的方式测试上述代码几乎是不可能的。B( 这样做也是不好的做法(如问题中所设想的那样(。因此,这里的"最佳"解决方案是退后一步,重新设计整个事情。是的,我是认真的。

最新更新