如何对返回 void 并抛出异常的方法进行 doThrow 或 thenThrow



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

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

法典:

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 ...

我希望测试会成功。

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

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

正如 Hulk 在评论中所说,此异常需要匹配方法签名,否则,您将获得MockitoException("Checked exception is invalid for this method!")

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

相关内容

  • 没有找到相关文章