在 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() 方法执行的快捷方式。此方法执行闭包的主体。