从Mockito模拟中抛出异常

时间:2011-04-15 15:58:00

标签: java unit-testing mockito

有些东西告诉我,我做错了什么......不应该这么难。

我有一个依赖于某个内部类的类。我正在通过受保护的方法创建内部,以便我可以在测试中覆盖它以提供模拟。我理解为了让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;
  }
}

1 个答案:

答案 0 :(得分:1)

请问您是否可以检查编译器是否真的抱怨RuntimeException

关于RuntimeException的事情是它在编译时无关紧要。我怀疑编译器实际上是抱怨MyException - 我认为这是一个检查过的异常,由编译器注意到,它由doSomething()方法抛出。您应该只需将throws MyException添加到测试方法中,然后由测试运行方捕获。由于预期,测试运行员将通过。