assertthrows用于断言指定自定义异常:传入异常类、lambda执行体,返回异常实例供进一步校验;避免手动try-catch;支持消息、字段及正则验证。

在 JUnit5 中,assertThrows 是专门用于验证代码是否抛出预期异常的断言方法。要断言抛出**指定的自定义异常**,关键在于:传入异常类型(Class)、执行可能抛异常的代码块(Lambda),并可选地对捕获到的异常对象做进一步校验。
基本用法:断言抛出指定自定义异常类型
假设你有一个自定义异常 InsufficientBalanceException:
public class InsufficientBalanceException extends RuntimeException {
public InsufficientBalanceException(String message) {
super(message);
}
}
业务方法中会在余额不足时抛出它:
public void withdraw(double amount) {
if (amount > balance) {
throw new InsufficientBalanceException("余额不足:" + amount);
}
balance -= amount;
}
单元测试中这样断言:
@Test
void withdraw_shouldThrowInsufficientBalanceException_whenAmountExceedsBalance() {
Account account = new Account(100.0);
InsufficientBalanceException exception = assertThrows(
InsufficientBalanceException.class,
() -> account.withdraw(200.0)
);
// 可选:验证异常消息是否符合预期
assertEquals("余额不足:200.0", exception.getMessage());
}
说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
assertThrows返回实际抛出的异常实例,可直接用于后续断言(如消息、字段等) - 第二个参数是
Executable函数式接口,用 Lambda 表达式包裹待测行为 - 如果没抛出该类型异常(或根本没抛异常),测试会失败
断言异常并校验消息(含正则匹配)
除了 assertEquals,还可使用更灵活的方式验证异常信息:
- 用
assertTrue(exception.getMessage().contains("余额不足")) - 用
assertThat(exception.getMessage(), containsString("余额不足"))(需引入 AssertJ 或 JUnit Jupiter 的assertThat) - 用正则:
assertTrue(exception.getMessage().matches("余额不足:\d+\.\d+"))
注意点:不要用 try-catch + fail 模拟 assertThrows
这是常见误区——手动 try-catch 并在 catch 外调用 fail():
// ❌ 不推荐:冗长、易出错、不利用 JUnit 内置机制
try {
account.withdraw(200.0);
fail("应该抛出 InsufficientBalanceException");
} catch (InsufficientBalanceException e) {
assertEquals("余额不足:200.0", e.getMessage());
}
这种写法无法自动捕获未预期的异常类型(比如抛了 NullPointerException 却被吞掉),也不支持 assertThrows 提供的异常对象复用能力。
扩展:断言嵌套异常或特定构造参数
若自定义异常有多个构造器或包含业务字段,可在获取异常实例后继续断言:
InsufficientBalanceException exception = assertThrows(
InsufficientBalanceException.class,
() -> account.withdraw(200.0)
);
// 假设异常类有 getRequestedAmount() 方法
assertEquals(200.0, exception.getRequestedAmount(), 0.01);
只要异常类暴露了可访问的属性或方法,就能做针对性校验,比只看类型或消息更可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










