【问题标题】:Throwing exceptions from Mockito mock从 Mockito 模拟中抛出异常
【发布时间】:2011-04-15 15:58:00
【问题描述】:

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

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

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

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

    RuntimeException 的问题在于,它在编译时并不重要。我怀疑编译器实际上是在抱怨MyException - 我认为这是一个检查异常,由编译器注意到,它是由doSomething() 方法抛出的。您应该能够简单地将throws MyException 添加到测试方法中,然后测试运行程序将捕获该方法。既然是预期的,那么测试运行器就会通过。

    【讨论】:

    • 是的,我的错。正如您所建议的,它真正抱怨的是 MyException。 InnerClass.go() 被声明为抛出 MyException (我在上面的代码中省略了它)。但是 OuterClass.createInner() 没有。我认为导致问题的不是 Mockito.doThrow() ......最终是对 .go() 的调用导致了问题。所以即使@test 方法已经声明 throws MyException,这也无济于事。
    • 啊哈!我想到了。我只需要将我的 doThrow...go() 东西包装在 try/catch 中,以将其隐藏在 create 方法中。但是当调用 create 方法时,它确实调用了 mock,它确实获取并捕获了 RuntimeException。
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 2022-07-29
    • 2011-04-15
    • 2013-04-21
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多