java单元测试验证异常抛出的核心是用assertthrows()断言指定代码块是否抛出预期异常类型,并结合mockito的dothrow()模拟void方法抛异常;需区分检查型与运行时异常,且须校验异常后的业务响应(如返回值、日志、回滚等)。

Java 单元测试中验证异常抛出,核心是用 assertThrows() 断言指定代码块是否按预期抛出特定异常类型,同时结合 mock 工具(如 Mockito)控制依赖行为,确保异常路径可触发、可验证。
用 assertThrows 验证异常类型
这是最直接、推荐的方式,适用于被测方法本身会抛出异常的场景:
- 传入期望的异常类和一段执行逻辑(Lambda 表达式),JUnit 会自动捕获并校验
- 如果没抛出异常,或抛出类型不匹配,测试直接失败
- 支持链式断言异常消息:
assertThrows(IllegalArgumentException.class, () -> service.process(null)).getMessage()
Mock void 方法时让其抛异常
当被测逻辑调用的是 void 方法(如日志记录、库存扣减),而你需要让它在特定参数下抛异常,必须用 Mockito 的 doThrow():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
doThrow(new BusinessException("库存不足")).when(inventoryService).deductStock("P001", 5);- 不能写
when(...).thenThrow()—— void 方法无返回值,该写法运行时会失效或报UnfinishedStubbingException - 若原方法签名未声明 throws 检查型异常(如 IOException),则只能抛运行时异常(RuntimeException 及其子类)
验证异常后的业务响应
抛出异常只是前提,重点是确认被测代码对异常做了正确处理:
- 如果方法声明抛异常:用
assertThrows(YourException.class, () -> ...)即可 - 如果异常被内部 catch 并转换为返回值(如 Result
):检查返回对象的 code、message字段 - 如果异常应触发日志、回滚或通知:mock 对应依赖(如 Logger、TransactionTemplate),再用
verify()检查是否调用
捕获参数 + 抛异常,双重验证
有时既要让 void 方法抛异常,又要确认它收到的参数是否符合预期:
- 先声明
ArgumentCaptor<string> captor = ArgumentCaptor.forClass(String.class);</string> - 再写
doThrow(new BusinessException()).when(service).process(captor.capture()); - 执行被测逻辑后,用
assertEquals("expected-id", captor.getValue());校验输入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










