【发布时间】:2016-04-27 10:51:36
【问题描述】:
我总是用注释测试我的异常。
@Test (expected = Exception.class)
public void test1() {
methodToTest() // throws an exception
}
我终于切换到 Java 8,并且遇到了 lambda 表达式。现在有另一个选项可以得到想要的结果。
@Test
public void test2() {
assertThrows(Exception.class, () -> methodToTest());
}
public static <X extends Throwable> Throwable assertThrows(
final Class<X> exceptionClass, final Runnable block) {
try {
block.run();
} catch(Throwable ex) {
if (exceptionClass.isInstance(ex))
return ex;
}
fail("Failed to throw expected exception");
return null;
}
我知道,使用第二个版本,您可以更精确地检查单个方法,并且您不必担心单个测试中的其他方法也会引发预期的异常。此外,使用“assertThrows”方法,所有测试都可以具有相同的结构,因为这一切都归结为对断言的调用。
除了这两点之外,对新方法有什么赞成的意见吗?对我来说,只要我只测试一个方法,使用注释感觉还是更好的选择在一次测试中。
【问题讨论】:
-
这个问题的 lambda 表达式在哪里?
-
"test2" 将 lambda 表达式交给 assertThrows 方法,该方法作为 Runnable 处理。
-
你在问为什么必须使用 lambda 表达式?或者为什么你会做所有这些而不是使用@Test (expected = Exception.class) 注释?如果是后者,您几乎自己回答了,这是 2 点。
-
抱歉我读得太快了
标签: java exception junit lambda java-8