从Mockito模拟投掷异常
问题描述:
东西告诉我我做错了什么事......它不应该这么难。从Mockito模拟投掷异常
我有一个依赖内部类的类。我通过一个受保护的方法创建了这个内部结构,这样我就可以在测试中覆盖它以提供模拟。我明白,要得到一个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;
}
}
答
能不能请您检查,编译器确实在抱怨一个RuntimeException
?
关于RuntimeException
的事情是它在编译时应该没关系。我怀疑编译器实际上是在抱怨MyException
- 我认为这是一个检查异常,由编译器注意到,这被doSomething()
方法抛出。您应该能够简单地将throws MyException
添加到测试方法中,然后由测试运行器捕获。由于预期,测试跑步者将通过。
是的,我的错误。正如你所建议的,它真正抱怨的是MyException。 InnerClass.go()被声明为抛出MyException(我把它留在上面的代码中)。但是OuterClass.createInner()不。我认为这不是导致问题的Mockito.doThrow()...这是对最终做到的.go()的调用。所以即使@test方法已经声明抛出MyException,但这没有帮助。 – DaveyBob 2011-04-15 17:26:05