我有一个看起来像这样的类:
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( 这样做也是不好的做法(如问题中所设想的那样(。因此,这里的"最佳"解决方案是退后一步,重新设计整个事情。是的,我是认真的。