junit 5 用 assertthrows 方法原生支持 lambda 断言异常,一行代码即可验证异常类型与消息;处理受检异常需 try-catch 包装为 runtimeexception 或用 assertj;注意调用括号、勿用于“不抛异常”场景。

JUnit 5 原生支持用 Lambda 表达式断言异常,核心是 assertThrows 方法——它让异常验证变得语义清晰、结构简洁,不再需要冗长的 try-catch + fail() 模板。
用 assertThrows 直接捕获并校验异常类型
只需一行代码,就能声明“这段逻辑必须抛出指定异常”:
assertThrows(NullPointerException.class, () -> obj.doSomething(null))- Lambda 内执行被测逻辑,JUnit 自动拦截并验证异常类型
- 若未抛出该异常,测试直接失败;若抛出其他异常,也视为失败
连带验证异常消息内容
类型正确只是第一步,业务异常通常还需检查提示信息是否准确:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 先获取异常实例:
Exception e = assertThrows(IllegalArgumentException.class, () -> parseAge(-5)) - 再断言消息:
assertEquals("age must be positive", e.getMessage()) - 也可链式组合:
assertTrue(e.getMessage().contains("timeout"))
处理受检异常(如 IOException)的稳妥写法
Lambda 无法直接抛出受检异常(因 Executable 接口不声明 throws),但有实用解法:
- 在 Lambda 内用 try-catch 包裹,并包装为运行时异常:
() -> { try { readFile(); } catch (IOException ex) { throw new RuntimeException(ex); } } - 更推荐封装成工具方法,统一转换,避免重复样板
- 或引入 AssertJ 的
catchThrowable(),原生支持受检异常捕获
避开常见陷阱
几个容易踩坑的细节:
- Lambda 调用必须加括号:
() -> method()✅,() -> method❌(编译失败) -
assertThrows只用于“必须抛”,不能用来验证“不抛异常”——后者直接调用即可 - 多行逻辑中,确保所有执行路径都可能触发异常,否则可能漏测关键分支
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










