@AfterEach是JUnit5中用于在每个@Test方法执行后自动运行一次的注解,常用于资源清理、状态重置等;它必须是实例方法、不可静态、不可带参,且无论测试成功或失败均会执行。

@AfterEach 是 JUnit 5 中的注解,用于在每个 @Test 方法执行完毕后自动运行一次,常用来释放资源、重置状态或清理测试产生的临时数据(如关闭文件、断开数据库连接、清空集合、还原 mock 行为等)。
什么时候该用 @AfterEach?
当你有以下情况时,适合用 @AfterEach:
- 每个测试方法都创建了独立的资源(比如临时文件、内存中的 Map、模拟的 Service 实例);
- 多个测试之间不能互相影响(例如:一个测试往 List 添加了元素,下一个测试需要干净的空 List);
- 你不想在每个
@Test方法末尾重复写清理逻辑,想统一管理; - 测试可能抛出异常,但你仍希望清理动作被执行(@AfterEach 保证无论测试成功或失败都会执行)。
@AfterEach 的基本写法
只需把清理逻辑写在一个无参、返回 void、且被 @AfterEach 标记的实例方法里即可:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class CalculatorTest {
private List<Integer> numbers;
@BeforeEach
void setUp() {
numbers = new ArrayList<>();
}
@Test
void testAddOne() {
numbers.add(1);
assertEquals(1, numbers.size());
}
@Test
void testAddTwo() {
numbers.add(2);
numbers.add(3);
assertEquals(2, numbers.size());
}
@AfterEach
void tearDown() {
numbers.clear(); // 确保下一个测试拿到空列表
}
}
注意点和常见误区
@AfterEach 方法本身不能带参数,也不能是 static;它属于实例方法,会随测试实例一起创建和销毁:
立即学习“Java免费学习笔记(深入)”;
- 不要在里面调用
System.exit()或阻塞线程(如Thread.sleep(10000)),否则拖慢整个测试套件; - 如果清理逻辑可能抛异常(比如关闭已关闭的流),建议捕获并记录,避免掩盖原始测试失败;
- 不要依赖 @AfterEach 来“修复”测试设计缺陷——比如本该用
@BeforeEach初始化却放在测试方法里,再靠 @AfterEach 补救; - 若需在所有测试方法执行完后只运行一次清理(如关闭共享数据库连接池),应使用
@AfterAll,且方法必须是 static。
和 @After 的区别
如果你还在用 JUnit 4,@After 功能类似,但 JUnit 5 已统一为 @AfterEach。迁移时只需替换注解名,方法签名不变。JUnit 5 不再识别 @After,用了会直接忽略。

















