java从Mockito mock抛出异常
有些事告诉我我做错了什么。。。不应该这么难
我有一个类依赖于一些内部类。我通过一个受保护的方法创建了这个内部,这样我就可以在测试中重写它来提供一个模拟。我知道要让Mockito mock对象从void方法抛出异常,我必须使用doThrow
但我的问题是,编译器抱怨调用Mockito。doThrow()正在引发RuntimeException。。。因此,我必须在设置mock的方法中添加一个throws子句。这是Mockito本身的一个bug吗?doThrow声明的是将来应该发生的事情,但不是在模拟的设置过程中
我的外屁股看起来像
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;
}
}
# 1 楼答案
请你检查一下编译器是否真的在抱怨
RuntimeException
关于
RuntimeException
的一点是,它在编译时应该无关紧要。我怀疑编译器实际上是在抱怨MyException
——我认为这是一个检查过的异常,编译器注意到了,它是由doSomething()
方法引发的。您应该能够简单地将throws MyException
添加到测试方法中,然后测试运行程序将捕获该方法。因为这是意料之中的事,试跑者会通过的