在Groovy中使用来自JUnit5的assertThrows

时间:2019-07-03 19:05:21

标签: groovy junit assert junit5

使用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 个答案:

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