我有一个看起来像这样的课:
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
。
答案 0 :(得分:2)
总的来说,你去。
Powermockito.doThrow(theThingToThrow)
去那里。例如doThrow(new RuntimeException("should be thrown"))
。或更具体的异常,这取决于您希望被测代码对异常进行处理。
但是,当然:您想在那里实例化一个私有类。您无法做到的(很容易找到here,以了解达到此目的的极其复杂的方法)。从这个角度来看:您创建了一个很难测试的设计。答案是对设计进行重新设计,使其更易于测试。
最后的警告是:我认为您不需要为此使用 Power Mockito。间谍与普通的Mockito一起工作。
并且当不需要使用 Power Mock(ito)版本时,请不要使用它们。期。他们有自己的位置,但是说实话:通常,需要PowerMock(ito)等于“难以测试代码”。
除此之外:查看私有方法可以转换为测试实施细节。这也是在可能的情况下要避免的事情。
因此,换句话说:A)以有意义的方式测试上述代码几乎是不可能的。 B)这样做(按照问题的设想)也是一种不好的做法。因此,这里的“最佳”解决方案是退后一步,重新设计整个产品。是的,我很认真。