@BeforeEach 和 @AfterEach 用于为每个测试方法提供独立的初始化与清理:前者在每个@Test前执行非静态方法以准备环境,后者在每个测试后无论成败均执行非静态方法以释放资源,二者与静态的@BeforeAll/@AfterAll(类级单次执行)严格区分。

@BeforeEach 和 @AfterEach 是 JUnit 5 中控制单个测试方法生命周期的关键注解,它们让每个测试用例拥有独立、干净的运行环境。
每个测试前自动准备:@BeforeEach 的用法
这个注解标记的方法会在每个 @Test(包括 @ParameterizedTest、@RepeatedTest)执行前调用一次,且针对的是当前测试方法对应的新测试实例。
- 方法必须是非静态的(不能加 static),可直接访问实例变量
- 适合初始化被测对象、创建 mock、清空集合、打开轻量级资源(如内存缓存、临时数据源)
- 可以接受 TestInfo 或 RepetitionInfo 等上下文参数,便于记录或条件处理
- 如果抛出异常,对应测试会被标记为失败,不会继续执行
每个测试后及时清理:@AfterEach 的作用
它在对应测试方法执行完后立即运行,无论该测试成功、失败还是被跳过,都保证执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同样要求是非静态方法,能访问实例状态
- 常用于关闭流、断开数据库连接、删除临时文件、清空列表或 Map、回滚事务
- 不建议在此做断言(断言应放在 @Test 内),但可用于验证清理是否到位(比如检查连接是否已关闭)
- 避免重置全局/静态状态,除非明确需要且线程安全
和 @BeforeAll / @AfterAll 的区别要分清
这两个注解作用范围完全不同:@BeforeAll 和 @AfterAll 在整个测试类生命周期中只执行一次,且必须是 static 方法。
立即学习“Java免费学习笔记(深入)”;
- @BeforeEach/@AfterEach 面向“每个测试方法”,保障隔离性;@BeforeAll/@AfterAll 面向“整个测试类”,适合耗时操作(如启动嵌入式数据库、初始化日志)
- 混用时注意顺序:@BeforeAll → 每轮 [@BeforeEach → @Test → @AfterEach] → @AfterAll
- 不要在 @AfterEach 中释放 @BeforeAll 分配的资源,否则后续测试会出错
实际写法要点
保持方法名语义清晰(如 setUp、tearDown),返回类型为 void,无参数(或仅支持的上下文参数)。
- 不要在 @BeforeEach 中复用上一个测试的实例,JUnit 默认为每个测试新建实例
- 避免在 @AfterEach 中抛出未捕获异常,否则可能掩盖测试本身的失败原因
- 若需共享资源(如线程池),优先考虑 @BeforeAll 初始化 + @AfterAll 清理,而非在每次测试中重复创建

















