在Groovy中使用JUnit5中的assertThrows

0x6upsns  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(151)

使用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 ....
anhgbhbe

anhgbhbe1#

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

@Test
void testExpectedException() {
  assertThrows(NumberFormatException.class, {
    Integer.parseInt("One");
  })
}

您可以通过以下方式让它更“时尚”:

@Test
void testExpectedException() {
  assertThrows(NumberFormatException) {
    Integer.parseInt("One")
  }
}

第二个例子使用了流行的Groovy习惯用法--当方法的最后一个参数是闭包时,你可以把它放在括号外面。它看起来像一个代码块,但它只是一个闭包,作为第二个参数传递给方法。
在Java示例中,您使用了作为Executable函数接口的示例传递的lambda表达式。Groovy的等效函数(至少在Groovy 2.x版本中-Groovy 3中添加了对lambda表达式的支持)是对SAM类型的闭包强制(单一抽象方法)。上面的范例显示如何定义具有闭包的Executable型别执行严修。如果您将()放在闭包右大括号之后,创建一个call()方法执行的快捷方式。该方法执行闭包的主体。

相关问题