@nested 是 junit5 用于构建层级化测试结构的语法糖,支持静态内部类、独立生命周期方法、树形报告展示及多层嵌套(建议不超过两层),需配合 @displayname 提升可读性。

@Nested 是 JUnit5 提供的用于组织测试逻辑的语法糖,它允许你用内部类的方式构建层级化的测试结构,让测试意图更明确、分组更自然,尤其适合对同一功能模块中不同状态或场景做细分验证。
用 @Nested 拆分关注点,避免单个测试类臃肿
当一个被测类有多种使用场景(如“空列表”“满容量”“并发修改”),把所有测试方法塞进一个顶层类,容易导致命名混乱、维护困难。@Nested 让你可以按语义建模:
- 每个 @Nested 类代表一个独立的关注维度(比如“边界条件”“异常路径”“正常流程”)
- 内部类可拥有自己的 @BeforeEach 和 @AfterEach,隔离准备/清理逻辑
- IDE 和测试报告会将嵌套类显示为树形结构(如
CalculatorTest ➝ When dividing ➝ should throw ArithmeticException)
嵌套类必须是静态内部类,且不能有构造参数
JUnit5 要求 @Nested 类是 static 的,否则无法实例化;也不能定义带参构造器,否则运行时抛出异常:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
// ✅ 正确写法
class CalculatorTest {
@Nested
class WhenDividing {
@Test
void shouldThrowWhenDividingByZero() {
assertThatThrownBy(() -> calculator.divide(10, 0))
.isInstanceOf(ArithmeticException.class);
}
}
}
注意:嵌套类不能访问外部类的非 static 字段——所以共享测试资源(如被测对象)建议声明为 static 或在每个 @Nested 类里独立初始化。
配合 @DisplayName 让测试名更可读
@Nested 类本身可加 @DisplayName,再配合测试方法上的 @DisplayName,能生成接近自然语言的描述:
-
@DisplayName("除法运算")修饰 @Nested 类 -
@DisplayName("除数为零时应抛出异常")修饰@Test 方法 - 最终在 IntelliJ 或 Maven Surefire 报告中显示为:“除法运算 › 除数为零时应抛出异常”
支持多层嵌套,但建议控制深度
理论上可以写 @Nested 套 @Nested,例如:WhenDividing ➝ WithNegativeNumbers ➝ shouldReturnNegativeResult。但实际中两层足够——三层及以上会增加理解成本,也违背“单一职责”原则。重点不是嵌多深,而是每层是否表达一个清晰、不可再分的测试意图。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










