Java单元测试应使用JUnit 5的Assertions工具类而非JVM的assert关键字,因其稳定、可读、可定制且始终生效;需添加junit-jupiter依赖,静态导入后可用assertEquals、assertTrue、assertNotNull、assertThrows、assertTimeout等方法,失败时提供清晰错误信息。

Java 单元测试中使用断言,核心是借助测试框架(如 JUnit 5)提供的 Assertions 工具类,而不是直接用 JVM 的 assert 关键字。后者默认关闭、不可控、不适用于测试场景;而 Assertions 是专为测试设计的稳定、可读、可定制的校验机制。
引入 JUnit 5 Assertions 依赖
确保项目已添加 JUnit 5 依赖(Maven 示例):
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.2</version><scope>test</scope></dependency>
无需额外启用参数,只要测试类被正确识别为 JUnit 5 测试,Assertions 就可直接使用。
常用断言方法与写法
所有方法均为静态导入(推荐),使用前加:import static org.junit.jupiter.api.Assertions.*;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
验证相等性:
assertEquals(expected, actual)或assertEquals(expected, actual, "提示消息")
例:assertEquals(4, add(2, 2), "2+2 应该等于 4") -
验证布尔条件:
assertTrue(condition)/assertFalse(condition)
例:assertTrue(list.size() > 0, "列表不应为空") -
验证非空:
assertNotNull(obj)/assertNull(obj)
例:assertNotNull(user, "用户对象必须初始化") -
验证异常抛出:
assertThrows(异常类型.class, 可执行代码块)
例:assertThrows(ArithmeticException.class, () -> divide(10, 0)) -
验证超时:
assertTimeout(Duration.ofMillis(100), () -> slowMethod())
断言失败时的表现
每次断言失败都会立即终止当前测试方法,并在测试报告中显示清晰错误信息:
- 实际值 vs 期望值对比(对
assertEquals等) - 自定义消息(如果提供)
- 堆栈位置(精确到哪一行调用)
- 不依赖 JVM 参数,始终生效,适合 CI/CD 自动化流程
不建议混用 JVM assert 关键字做单元测试
尽管语法上可以写 assert x == 5;,但存在明显问题:
- 默认禁用,CI 环境可能完全跳过,导致“假通过”
- 抛出
AssertionError(继承自Error),JUnit 无法统一捕获和格式化 - 无预期/实际值比对、无异常类型校验等高级能力
- IDE 和测试报告无法识别其语义,调试体验差

















