junit 5提供@beforeeach、@aftereach、@beforeall、@afterall四类注解管理测试资源:前两者在每个测试方法前后执行,要求public void无参非static;后两者在整类前后执行一次,必须static且注意线程安全。

Java 单元测试中,初始化和销毁方法用于统一管理测试资源的准备与释放,确保每个测试用例在干净、可控的环境中运行,避免相互干扰。JUnit 5 提供了四类标准注解来支持这一流程,使用时需注意作用范围和执行时机。
@BeforeEach 和 @AfterEach:每个测试方法前后执行
适用于需要为每个测试方法单独创建/释放轻量级资源的场景,比如实例对象、临时文件、内存状态等。
- @BeforeEach 标注的方法在每个 @Test 方法执行前调用一次
- @AfterEach 标注的方法在每个 @Test 方法执行后调用一次
- 方法必须是 public void 无参,且不能是 static
- 典型用途:new 一个被测对象、打开一个内存数据库连接、重置静态计数器
@BeforeAll 和 @AfterAll:整个测试类前后执行一次
适合耗时或共享型资源的全局初始化与清理,例如启动嵌入式服务器、建立一次数据库连接池、加载大型配置文件。
- @BeforeAll 方法在该测试类所有测试方法开始前执行一次,必须是 static
- @AfterAll 方法在该测试类所有测试方法结束后执行一次,也必须是 static
- 注意线程安全:多个测试可能并发执行,共享资源需加锁或使用线程安全结构
- 常见误用:在 @BeforeAll 中 new 实例并赋给非 static 字段——会导致空指针异常
初始化与销毁的典型配合模式
实际项目中常组合使用,形成分层资源管理:
- 用 @BeforeAll 建立共享连接(如 H2 数据库连接池)
- 用 @BeforeEach 开启事务、清空测试表、构造新 Service 实例
- 用 @AfterEach 回滚事务、关闭当前请求上下文、断言资源已释放
- 用 @AfterAll 关闭连接池、删除临时目录、注销全局监听器
注意事项与易错点
这些看似简单的机制,容易因细节疏忽导致测试不稳定:
- 不要在 @BeforeAll / @AfterAll 方法中操作非 static 成员变量
- @BeforeEach 中若抛出异常,对应 @Test 不会执行,但 @AfterEach 仍会运行(可用于兜底清理)
- 若 @AfterEach 清理失败(如文件删不掉),不会中断后续测试,但可能影响下一个 @BeforeEach
- 测试类继承自父类时,父类的 @BeforeEach/@AfterEach 也会按继承顺序执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











