@Nested 是 JUnit 5 用于定义非静态内部嵌套类的注解,支持多层嵌套、独立生命周期和层级化测试组织,但不可加 static 修饰符,否则被忽略。

@Nested 是 JUnit 5 引入的注解,用于在测试类中定义嵌套的内部类,从而组织逻辑相关的测试用例,形成清晰的层次结构。它不依赖外部类的实例(即嵌套类可以是 static 的),但必须是非静态内部类(即不能加 static 修饰符),以便能访问外部测试类的字段和方法。
嵌套类的基本写法
被 @Nested 标记的类必须是内部类(非 static),可有自己的 @BeforeEach、@AfterEach,甚至嵌套多层:
- 外层测试类负责公共初始化或共享状态
- 每个
@Nested类代表一个业务场景或功能子模块 - 嵌套类中的测试方法会出现在测试运行器中,路径显示为 “外层类 > 嵌套类 > 方法名”
共享状态与生命周期控制
嵌套类可继承外层的生命周期方法,也可定义自己的。注意:每个嵌套类实例独立创建,彼此隔离:
- 外层
@BeforeEach在每个嵌套类的每个测试方法前执行一次 - 嵌套类内的
@BeforeEach在该类内每个测试方法前执行(在外层之后) - 字段可在嵌套类中声明,但不要依赖外层实例字段的跨类修改(因每次测试新建实例)
命名与可读性优化
嵌套类名建议用描述性名称(如 WhenUserIsAdmin、WithEmptyInput),配合 @DisplayName 提升报告可读性:
立即学习“Java免费学习笔记(深入)”;
- 给嵌套类加
@DisplayName("用户登录成功场景") - 测试方法也用
@DisplayName写业务语言,比如"应返回有效 token" - IDE 和 Maven Surefire 报告中会按嵌套路径展示层级,便于定位失败用例
避免常见错误
使用 @Nested 时容易踩坑:
- 嵌套类误加
static→ JUnit 会忽略该类,不执行其中测试 - 嵌套类构造函数含参数或非 public → 运行时报错“no default constructor”
- 在嵌套类中直接 new 外部类实例 → 破坏测试隔离,应通过字段注入或方法传参
- 过度嵌套(超过 2 层)→ 可读性下降,建议拆分为多个顶层测试类


















