有些东西告诉我,我做错了什么......应该不会这么难。
我有一个依赖于某个内部类的类。我通过一个受保护的方法创建它,以便我可以在测试中重写它并提供一个模拟对象。我知道要让Mockito模拟对象从void方法中抛出异常,我必须使用doThrow。
但是我的问题是,编译器抱怨对Mockito.doThrow()的调用会抛出RuntimeException......所以我必须在设置模拟的方法中添加throws子句。这是Mockito本身的错误吗?doThrow声明了将来应该发生的事情,而不是在设置模拟期间发生的事情。
我的OuterClass看起来像...
public class OuterClass {
protected InnerClass inner;
protected void createInner() { inner = new InnerClass(); }
protected doSomething() {
try {
inner.go();
} catch (RuntimeException re) {
throw new MyException("computer has caught fire");
}
}
}
我的测试代码看起来像这样...
@Test(expected = MyException.class)
public void testSomething() {
OuterClass outer = new TestOuterClass();
outer.doSomething();
}
public static class TestOuterClass extends OuterClass {
@Override
public void createInner() {
InnerClass mock = Mockito.mock(InnerClass.mock);
Mockito.doThrow(new RuntimeException("test")).when(mock).go(); // PROBLEM
inner = mock;
}
}