使用Java和assertThrows时:
public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable)
我们可以编写简单的lambda函数:
@Test
void testExpectedException() {
Assertions.assertThrows(NumberFormatException.class, () -> {
Integer.parseInt("One");
});
}
我们如何在Groovy中做到这一点?
我正在尝试类似的事情:
@Test
void testExpectedException() {
assertThrows(NumberFormatException.class, {
Integer.parseInt("One");
}())
}
但是抛出了错误并且没有发现错误:
java.lang.format.NumberFormatException: For ....
答案 0 :(得分:2)
您的测试方法有一个错误。您没有将闭包强制为Executable
类型,而是传递了调用闭包的结果。正确的语法是:
@Test
void testExpectedException() {
assertThrows(NumberFormatException.class, {
Integer.parseInt("One");
})
}
您可以使用以下方法使它更“ groovier”:
@Test
void testExpectedException() {
assertThrows(NumberFormatException) {
Integer.parseInt("One")
}
}
第二个示例使用流行的Groovy习惯用法-当方法的最后一个参数是闭包时,可以将其放在括号之外。它看起来像一个代码块,但它只是作为第二个参数传递给该方法的闭包。
在Java示例中,您使用了作为Executable
功能接口实例传递的lambda表达式。 Groovy的等效项(至少在Groovy 2.x版本中-在Groovy 3中添加了对lambda表达式的支持)是对SAM类型的闭包强制(单一抽象方法)。上面的示例显示了如何使用闭包定义Executable
类型的实例。如果将()
放在闭包右括号之后,则会为执行call()
方法的快捷方式。此方法执行闭包的主体。