我有一个集成测试,其中我调用的方法之一有时会引发异常。我想忽略异常,但我想以最优雅的方式做到这一点。
最初我这样做是这样的:
// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();
// WHEN
try{
coffee.spill()
}catch(Exception e){
// Ignore this exception. I don't care what coffee.spill
// does as long as it doesn't corrupt my newspaper
}
// THEN
Assert.assertTrue(newspaper.isReadable);
在浏览stackoverflow时,我注意到in this answer我可以像这样重写我的代码:
// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();
// WHEN
ingoreExceptions(() -> coffee.spill());
// THEN
Assert.assertTrue(newspaper.isReadable);
但是,我需要提供我自己的{{ignoringExc}}实现:
public static void ingoreExceptions(RunnableExc r) {
try { r.run(); } catch (Exception e) { }
}
@FunctionalInterface public interface RunnableExc { void run() throws Exception; }
问题:
这似乎是一个足够通用的代码,我应该能够使用别人的代码。不想重新发明轮子。
答案 0 :(得分:6)
使用内置功能的最简单方法,我能想到的是
new FutureTask<>(() -> coffee.spill()).run();
FutureTask
不会忽略异常,但会捕获并记录异常,因此您仍然决定不查询结果。
如果spill()
已声明为void
,则不能将Callable
简单地用作new FutureTask<>(() -> { coffee.spill(); return null; }).run();
,因此您必须使用
try{ coffee.spill(); } catch(Exception e){}
ignoreExceptions(() -> coffee.spill());// saved four chars...
但值得商榷的是,基于lambda表达式的解决方案是否可以是原始代码的简化,由于换行符而看起来不那么简洁:
Authorization