JUNIT5 中的 AssertThrows

gho*_*der 1 java junit java-8

我努力学习assertThrowsjunit5,它需要Executable作为具有第二ARGvoid execute()方法。但是,在下面的示例中,我们正在通过相同的示例传递它,LAMBDA它返回一个带有方法的双精度值double divide(int a , int b)。现在,如果下面的 lambdaexecuteExcecutable. 应该给compile error吧?

assertThrows(ArithmeticException.class,() -> m.divide(1, 0),"Failed");
Run Code Online (Sandbox Code Playgroud)

And*_*ner 6

() -> m.divide(1, 0)
Run Code Online (Sandbox Code Playgroud)

被有效地对待

new Executable() {
  @Override public void execute() {
    m.divide(1, 0);
  }
}
Run Code Online (Sandbox Code Playgroud)

可以将 lambda 视为具有单个抽象方法的任何接口/类的实例。

Lambda 始终是多表达式,这意味着它们的确切类型取决于使用它们的上下文。

不存在兼容性问题。

  • @ghostrider:方法返回一个值并不意味着您必须对其执行某些操作。在这种情况下,编译器会正确解析表达式并丢弃返回值。 (2认同)
  • @ghostrider:因为这是无效的语法(您手动定义的),而在这种情况下,编译器会自动知道要使用的正确语法。 (2认同)