【问题标题】:How to doThrow or thenThrow on method that returns void and throws an exception如何在返回 void 并引发异常的方法上执行 doThrow 或 thenThrow
【发布时间】:2019-01-03 10:27:12
【问题描述】:

我有一个方法process,它返回 void,也可能抛出异常。我想验证调用process 时其他方法run 的行为如何,并在发生异常时处理。

我尝试使用doThrow(),但它告诉“检查的异常对此方法无效!”。然后我尝试使用thenThrow(),但它需要一个非空函数。

代码:

public void run() {
    for (var billet : getBillets()) {
        try {
            process(billet);
            billet.status = "processed";
        } catch (Exception e) {
            billet.status = "error";
        }

        billet.update();
    }
}

public void process(Billet billet) throws Exception {
    var data = parse(billet.data); // may throw an exception
    var meta = data.get("meta"); // may throw an exception

    // ... more parsing ...

    new Product(meta).save();
    new Item(meta).save();

    // ... more operations ...
};

测试:

var billet1 = new Billet();
var billet2 = new Billet();

doThrow(new Exception()).when(myInctance).process(billet2);
myInctance.run();
assertEquals("processed", billet1.status);
assertEquals("error", billet2.status);

// ... some checks ...

我希望测试会成功。

【问题讨论】:

  • 这听起来不太可能。我的猜测是您过度简化了您共享的代码,并且您真正使用的代码是不同的。使用您在那里显示的代码,您将不会得到您所描述的结果。您应该展示您真正使用的代码而不是其他代码。
  • doThrow 确实适用于检查异常,但您需要根据您的方法签名抛出正确类型的异常。如果没有声明检查异常,则抛出 RuntimeException 而不是 Exception
  • @hulk,谢谢。成功了!

标签: java mockito


【解决方案1】:

这是告诉模拟抛出异常的正确方法:

Mockito.doThrow(new SomeException()).when(mock).doSomething()

正如hulk在cmets中所说,这个异常需要匹配方法签名,否则,你会得到一个MockitoException("Checked exception is invalid for this method!")

您可以通过抛出某种类型的RuntimeException 来绕过该异常。最后,您应该尽量避免使用通用的Exception。抛出适当的命名异常要有用得多。

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2015-03-08
    • 2014-02-10
    • 2011-07-19
    • 2012-10-16
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多