我有一个集成测试,其中我称为的一种方法有时会引发异常。我想忽略例外,但我想以最优雅的方式做到这一点。
最初我这样做:
// 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时,我在答案中注意到我可以这样重写我的代码:
// GIVEN
NewsPaper newspaper = new NewsPaper();
Coffee coffee = new Coffee();
// WHEN
ingoreExceptions(() -> coffee.spill());
// THEN
Assert.assertTrue(newspaper.isReadable);
但是,我需要提供自己的{{nighoringExc}}的实现:
public static void ingoreExceptions(RunnableExc r) {
try { r.run(); } catch (Exception e) { }
}
@FunctionalInterface public interface RunnableExc { void run() throws Exception; }
问题:
- java8是否可以使用类似的东西来运输?
- 哪些公用事业库有这样的东西?
这似乎是一条足够的代码,我应该能够使用别人的代码。不想重新发明轮子。
使用内置功能的最简单方法,我可以想出
new FutureTask<>(() -> coffee.spill()).run();
FutureTask
不忽略异常,而是捕获并记录它们,因此您仍然决定不查询结果。
如果spill()
已声明为void
,则不能用作Callable
,因此您必须使用
new FutureTask<>(() -> { coffee.spill(); return null; }).run();
但值得商bat,是否可以基于LAMBDA表达的解决方案是您原始代码的简化,由于线路破裂,它看起来只不及简洁:
try{ coffee.spill(); } catch(Exception e){}
ignoreExceptions(() -> coffee.spill());// saved four chars...