【发布时间】: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,谢谢。成功了!