如何在返回void并引发异常的方法上抛出Throw或thenThrow

时间:2019-01-03 10:27:12

标签: java mockito

我有一个方法process,该方法返回void并且还可能引发异常。我想验证调用run时其他方法process的行为,并处理发生的异常。

我尝试使用doThrow(),但是它告诉“已检查的异常对该方法无效!”。然后,我尝试使用thenThrow(),但是它需要一个not 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 ...

我希望测试会成功。

1 个答案:

答案 0 :(得分:0)

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

const chunkArray = (arr, size) =>
  arr.length > size
    ? [arr.slice(0, size), ...chunkArray(arr.slice(size), size)]
    : [arr];

正如Hulk在评论中所述,此异常需要匹配方法签名,否则,您将获得Mockito.doThrow(new SomeException()).when(mock).doSomething()

您可以通过抛出某种类型的MockitoException("Checked exception is invalid for this method!")来解决该异常。最后,您应该避免使用通用的RuntimeException。抛出适当的命名异常要有用得多。