有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    请你检查一下编译器是否真的在抱怨RuntimeException

    关于RuntimeException的一点是,它在编译时应该无关紧要。我怀疑编译器实际上是在抱怨MyException——我认为这是一个检查过的异常,编译器注意到了,它是由doSomething()方法引发的。您应该能够简单地将throws MyException添加到测试方法中,然后测试运行程序将捕获该方法。因为这是意料之中的事,试跑者会通过的