@beforeeach 和 @aftereach 分别在每个@test前、后执行,用于轻量级、隔离的环境准备与清理;必须是无参void实例方法,确保测试间状态隔离,不可替代类级的@beforeall/@afterall。

@BeforeEach 和 @AfterEach 是 JUnit 5 中控制测试生命周期的关键注解,分别用于在每个 @Test 方法执行前、后自动运行,适合做轻量级、隔离性强的环境准备与清理。
@BeforeEach:每次测试前重建干净起点
它必须是实例方法(不能加 static),返回 void、无参数。JUnit 为每个测试单独调用一次,确保状态不跨测试污染。
- 新建被测对象实例,比如 calculator = new Calculator();
- 初始化空集合供当前测试填充,如 list = new ArrayList();
- 重置共享但可变的状态,例如清空静态计数器或 mock 行为
- 设置模拟对象(Mock)的固定响应,避免不同测试间行为串扰
@AfterEach:及时释放资源、还原现场
同样为实例方法,常用于释放临时资源、关闭连接、清空缓存、重置系统属性等收尾操作,保障后续测试不受残留影响。
- 关闭打开的文件流、数据库连接或网络客户端
- 清空临时目录或删除生成的测试文件
- 调用 mock 的 reset() 方法,防止 stub 行为延续到下一个测试
- 还原被修改的系统属性,如 System.clearProperty("test.mode");
典型搭配写法示例
一个常见模式是:@BeforeEach 创建新对象 + @AfterEach 清理副作用。例如测试一个依赖外部配置的服务:
- @BeforeEach 中构造新服务实例,并注入测试专用配置
- @AfterEach 中清除该实例持有的内部缓存或关闭其内部线程池
- 避免使用 static 字段保存测试对象,否则 @BeforeEach 失效
注意和避坑点
这两个注解不能替代 @BeforeAll/@AfterAll —— 后者用于整个类级别的一次性操作(如启动嵌入式数据库)。若在 @BeforeEach 中做了重量级初始化(如建表、加载大文件),会导致测试变慢、难以并行;应移至 @BeforeAll 并配合线程安全设计。
当遇到系统属性或静态单例干扰时(比如 DataSource 初始化后无法重置),单纯靠 @BeforeEach 不够,需重构代码解除静态耦合,让对象可重复构建。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











