在 Groovy 中使用 JUnit5 中的 assertThrows
Using assertThrows from JUnit5 in Groovy
当使用 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 ....
你的测试方法有一个错误。您没有将闭包强制转换为 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()
方法执行的快捷方式。此方法执行闭包的主体。
当使用 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 ....
你的测试方法有一个错误。您没有将闭包强制转换为 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()
方法执行的快捷方式。此方法执行闭包的主体。