在 Groovy 中使用 JUnit5 的断言抛出

Chr*_*ris 4 groovy junit assert junit5

当使用Java和assertThrows时:

public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable)
Run Code Online (Sandbox Code Playgroud)

我们可以编写简单的 lambda 函数:

@Test
void testExpectedException() {

  Assertions.assertThrows(NumberFormatException.class, () -> {
    Integer.parseInt("One");
  });

}
Run Code Online (Sandbox Code Playgroud)

我们如何在 Groovy 中做到这一点?

我正在尝试类似的事情:

@Test
void testExpectedException() {

  assertThrows(NumberFormatException.class, {
    Integer.parseInt("One");
  }())

}
Run Code Online (Sandbox Code Playgroud)

但错误被抛出并且没有被捕获:

java.lang.format.NumberFormatException: For ....
Run Code Online (Sandbox Code Playgroud)

Szy*_*iak 6

你的测试方法有一个错误。您没有强制将闭包强制为Executable类型,而是传递了调用闭包的结果。正确的语法是:

@Test
void testExpectedException() {
  assertThrows(NumberFormatException.class, {
    Integer.parseInt("One");
  })
}
Run Code Online (Sandbox Code Playgroud)

你可以用以下方法让它变得更“groovier”:

@Test
void testExpectedException() {
  assertThrows(NumberFormatException) {
    Integer.parseInt("One")
  }
}
Run Code Online (Sandbox Code Playgroud)

第二个示例使用流行的 Groovy 习惯用法 - 当方法的最后一个参数是闭包时,您可以将其放在括号之外。它看起来像一个代码块,但它只是作为第二个参数传递给方法的闭包。

Executable在 Java 示例中,您使用了作为函数接口实例传递的 lambda 表达式。Groovy 的等效项(至少在 Groovy 2.x 版本中 - Groovy 3 中添加了对 lambda 表达式的支持)是对 SAM 类型(单一抽象方法)的闭包强制转换。上面的示例展示了如何使用Executable闭包定义类型的实例。如果将()闭包放在右大括号后面,则会创建call()方法执行的快捷方式。该方法执行闭包的主体。