assertThrows用于验证代码是否抛出指定类型异常并获取异常实例以进一步检查。它接收异常类和Executable函数式接口,支持验证异常消息等细节,比try-catch+fail更简洁精准。

在 JUnit5 中,assertThrows 是专门用于验证某段代码是否抛出**指定类型异常**的断言方法。它不仅检查异常是否发生,还能获取异常实例,进一步验证异常消息、原因等细节。
基本用法:断言抛出指定异常类型
最常见场景是确认某个操作确实触发了预期的异常(比如空指针、非法参数等),而不关心具体消息内容:
Exception exception = assertThrows(NullPointerException.class, () -> {
someObject.doSomething(null);
});
// 此时 exception 就是实际抛出的 NullPointerException 实例
注意:assertThrows 的第一个参数是异常类(如 IllegalArgumentException.class),第二个是函数式接口 Executable(即一段可能抛异常的代码逻辑)。
验证异常消息是否匹配
拿到异常对象后,可直接调用 getMessage() 或使用其他断言做进一步检查:
立即学习“Java免费学习笔记(深入)”;
- 用
assertEquals比对完整消息 - 用
assertTrue(exception.getMessage().contains("xxx"))检查子串 - 用正则匹配(配合
Pattern或第三方库如 AssertJ)
示例:
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
validateAge(-5);
});
assertEquals("年龄不能为负数", exception.getMessage());
注意点:不要写错异常类型或遗漏 lambda
常见错误包括:
- 传入父类异常(如用
RuntimeException.class去捕获IllegalArgumentException)——虽然能通过,但不够精确 - lambda 中没真正执行会抛异常的代码(比如只写了变量名、没加括号调用)
- 误把异常构造写在 lambda 外(导致测试本身抛异常,而非被测代码)
正确写法必须是:lambda 内部**执行被测方法调用**,且该调用在运行时抛出异常。
不推荐的替代写法:try-catch + fail
JUnit4 风格的写法(手动 try-catch 加 fail())在 JUnit5 中已不必要:
try {
doSomething(null);
fail("应该抛出 NullPointerException");
} catch (NullPointerException e) {
// 成功
}
这种写法冗长、易出错,且无法便捷获取异常对象。而 assertThrows 更简洁、语义清晰、支持链式验证。


















