JUnit中assertThrows写法要点及lambda表达式()的含义咨询
问题解答
一、该assertThrows写法需要掌握的基础知识点
- JUnit 5 异常断言规则:
assertThrows是JUnit 5内置的异常校验API,作用是验证指定代码块执行时必须抛出预期类型的异常,方法返回值为抛出的异常实例,可后续对异常信息、栈轨迹等做二次校验。该方法第一个入参要求传入预期异常的Class对象,第二个入参为待执行的测试代码块。 - Java Class对象概念:
StudentException.class是Java中获取对应类型Class对象的固定写法,assertThrows通过该参数匹配实际抛出的异常类型是否符合预期。 - Java Lambda表达式基础:
assertThrows第二个入参的类型为Executable函数式接口,支持用Lambda表达式简化匿名内部类的冗余写法。 - 函数式接口定义:只有一个抽象方法的接口属于函数式接口,仅这类接口可以用Lambda表达式直接实例化,JUnit的
Executable接口仅包含一个无参抽象方法execute(),符合Lambda适配要求。 - Lambda变量捕获规则:Lambda内部引用的外部局部变量(比如示例中的
name、student实例)必须为final或等效final(赋值后无二次修改),否则会触发编译报错。
二、Lambda表达式中()的含义
示例中() -> student.findName(name)的(),对应其适配的函数式接口抽象方法的参数列表。
因为Executable的execute()方法本身没有入参,所以Lambda的参数列表位置写空括号(),表示该Lambda实例对应的方法不需要传入任何参数。无参场景下()不可省略,仅当参数列表只有一个参数时,才可以省略括号,比如(str) -> System.out.println(str)可简写为str -> System.out.println(str)。
对应匿名内部类写法可直观对比参数逻辑:
new Executable() { @Override public void execute() throws Throwable { // 此处无入参,对应Lambda的空括号() student.findName(name); } }
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

