总觉得我做错了什么…不应该这么难的。
我有一个依赖于某个内部类的类。我通过一个受保护的方法创建了这个内部,这样我就可以在测试中覆盖它来提供模拟。我明白,要获得Mockito模拟对象从void方法抛出异常,我必须使用doThrow。
但我的问题是,编译器抱怨调用Mockito.doThrow()抛出RuntimeException…因此,我必须向设置模拟的方法添加一个抛出子句。这是Mockito本身的问题吗?doThrow声明了一些应该在将来发生的事情,而不是在模拟设置期间发生的事情。
My OuterClass looks like…
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;
}
}
请检查编译器是否真的在抱怨RuntimeException
关于RuntimeException
的事情是,它在编译时应该无关紧要。我怀疑编译器实际上是在抱怨MyException
-我认为这是一个检查异常,由编译器注意到,这是由doSomething()
方法抛出。您应该能够简单地将throws MyException
添加到测试方法中,然后由测试运行器捕获。因为它是预期的,所以测试运行器将通过。