使用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 ....
1条答案
按热度按时间anhgbhbe1#
您的测试方法中有一个错误。您没有将闭包强制为
Executable
类型,而是传递了调用闭包的结果。正确的语法为:您可以通过以下方式让它更“时尚”:
第二个例子使用了流行的Groovy习惯用法--当方法的最后一个参数是闭包时,你可以把它放在括号外面。它看起来像一个代码块,但它只是一个闭包,作为第二个参数传递给方法。
在Java示例中,您使用了作为
Executable
函数接口的示例传递的lambda表达式。Groovy的等效函数(至少在Groovy 2.x版本中-Groovy 3中添加了对lambda表达式的支持)是对SAM类型的闭包强制(单一抽象方法)。上面的范例显示如何定义具有闭包的Executable
型别执行严修。如果您将()
放在闭包右大括号之后,创建一个call()
方法执行的快捷方式。该方法执行闭包的主体。