有些东西告诉我,我做错了什么......不应该这么难。
我有一个依赖于某个内部类的类。我正在通过受保护的方法创建内部,以便我可以在测试中覆盖它以提供模拟。我理解为了让Mockito模拟对象从void方法中抛出异常,我必须使用doThrow。
但我的问题是编译器抱怨调用Mockito.doThrow()会抛出RuntimeException ...所以我必须在设置mock的方法中添加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;
}
}
答案 0 :(得分:1)
请问您是否可以检查编译器是否真的抱怨RuntimeException
?
关于RuntimeException
的事情是它在编译时无关紧要。我怀疑编译器实际上是抱怨MyException
- 我认为这是一个检查过的异常,由编译器注意到,它由doSomething()
方法抛出。您应该只需将throws MyException
添加到测试方法中,然后由测试运行方捕获。由于预期,测试运行员将通过。