Java自定义异常单元测试的核心是验证异常在预期条件下被正确抛出,并检查其类型、消息、原因等属性;JUnit 5通过assertThrows()断言异常类型并获取实例,支持链式校验消息、cause及构造完整性,需覆盖空值、负数等边界场景。

Java 中自定义异常的单元测试,核心是验证异常是否在预期条件下被正确抛出,并检查其类型、消息、原因等关键属性是否符合设计预期。JUnit 5 提供了简洁可靠的断言方式,无需依赖 try-catch 手动捕获,代码更清晰、可读性更强。
验证异常是否被抛出(基础断言)
使用 JUnit 5 的 assertThrows() 方法是最直接的方式。它会执行一段代码,若抛出指定类型的异常则通过,否则失败。
- 语法示例:assertThrows(YourCustomException.class, () -> methodThatShouldThrow());
- 返回值是捕获到的异常实例,可用于后续属性校验(如 getMessage())
- 确保被测方法在触发条件满足时确实会进入抛出异常的逻辑分支
验证异常消息是否准确
仅检查异常类型不够,业务异常通常需携带明确的提示信息。可在 assertThrows 后链式调用断言:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Exception e = assertThrows(ValidationException.class, () -> validate(""));
e.getMessage().contains("用户名不能为空"); - 推荐使用 Assertions.assertTrue(e.getMessage().startsWith("...")) 或 assertEquals("预期消息", e.getMessage()),避免因空格或格式差异导致误判
- 若消息含动态参数(如字段名、数值),建议用字符串模板比对或正则匹配
验证异常的 cause(嵌套异常)和构造完整性
当自定义异常支持传入 cause(如继承 RuntimeException 并提供 Throwable 构造器),需验证其是否被正确封装:
立即学习“Java免费学习笔记(深入)”;
- Exception e = assertThrows(BusinessException.class, () -> doSomething());
assertTrue(e.getCause() instanceof IOException); - 检查自定义异常的构造器是否完整传递了 message、cause、甚至错误码等字段(如有)
- 若异常类有 getter 方法(如 getErrorCode()),也应一并断言其值
覆盖边界与非法输入场景
单元测试要聚焦“该抛异常的地方必须抛”,常见要点包括:
- 空值、空字符串、负数、超长字符串等典型非法输入
- 状态不满足前提条件时(如对象未初始化、资源已关闭)
- 避免只测“happy path”,至少为每个 throw 语句写一个对应失败用例
- 可借助参数化测试(@ParameterizedTest)批量验证多组非法输入

















