assertAll可一次性执行全部断言并汇总失败项,支持命名分组与嵌套结构化校验,但要求各断言独立幂等且不依赖顺序,非AssertionError异常会导致立即中断。

直接用 assertAll 就行,它能一次性跑完所有断言,把全部失败项都列出来,而不是一错就停。
基本用法:传入多个 lambda 断言
每个断言写成一个无参 lambda 表达式,assertAll 会依次执行它们:
- 全部通过 → 测试成功
- 任一失败 → 测试失败,但其余断言仍会执行
- 最终报错信息里会汇总所有失败点(含行号和具体不匹配内容)
示例:
@Test
void testUserProperties() {
User user = new User("张三", 25, "zhang@example.com");
assertAll("验证用户对象",
() -> assertEquals("张三", user.getName()),
() -> assertEquals(25, user.getAge()),
() -> assertTrue(user.getEmail().endsWith("@example.com")),
() -> assertNotNull(user.getId()) // 假设此处为 null,会失败
);
}
命名分组:提升错误定位效率
第一个参数是可选的分组名称,出现在失败报告顶部,方便快速识别哪一组断言出问题:
- 比如传
"响应字段校验"或"权限规则检查" - 当有嵌套
assertAll时,层级名会拼接显示,例如"主流程 > 订单创建 > 支付字段"
嵌套使用:支持多级结构化校验
可以在某个 lambda 内再调用 assertAll,适合校验子对象或条件分支:
() -> assertAll("地址信息",
() -> assertNotNull(user.getAddress()),
() -> assertEquals("北京市", user.getAddress().getCity()),
() -> assertTrue(user.getAddress().isValid())
)
这样即使外层其他断言也失败,地址相关的失败项仍会归在“地址信息”下,结构清晰。
注意事项:避免副作用和顺序依赖
assertAll 不保证执行顺序(虽然当前实现是顺序执行),所以别让断言之间互相依赖:
- ❌ 不要在第二个 lambda 里修改第一个 lambda 用到的对象状态
- ❌ 不要靠前一个断言的副作用来支撑后一个断言的逻辑
- ✅ 所有断言应独立、幂等,只做读取和比对
另外,它不捕获运行时异常(如 NullPointerException),只处理断言失败(AssertionError)。如果某 lambda 抛出非断言异常,整个 assertAll 会立即中断。


















