@AfterEach用于在每个@Test方法执行后清理资源、重置状态以保障测试隔离;它作用于实例级,必须是非静态的void方法,且无论测试是否异常都会执行。

@AfterEach 是 JUnit 5 中用于在每个 @Test 方法执行后自动运行的生命周期方法,主要作用是清理测试过程中产生的脏数据、释放资源、重置状态,确保测试之间相互隔离、互不干扰。
什么时候该用 @AfterEach?
当你在测试中做了以下操作时,就需要在 @AfterEach 中做对应清理:
- 向内存集合(如
ArrayList、HashMap)添加了测试数据 - 修改了静态变量或单例对象的状态
- 使用了模拟对象(Mockito)并需要重置行为
- 打开了文件、网络连接、数据库连接等外部资源(需显式关闭)
- 启动了线程、定时器、事件监听器等后台活动
基本写法和注意事项
只需在普通方法上添加 @AfterEach 注解,方法必须是 public void,不能带参数,也不能返回值:
@AfterEach
void tearDown() {
// 清理逻辑,例如:
testData.clear();
DatabaseConnection.closeAllConnections();
reset(mockService); // Mockito.reset()
}
注意:JUnit 5 不要求方法名必须是 tearDown,但建议语义清晰;多个 @AfterEach 方法会按声明顺序执行;它一定会执行,即使测试抛出异常(类似 try-finally 中的 finally)。
立即学习“Java免费学习笔记(深入)”;
常见清理场景示例
1. 清空共享集合
如果多个测试共用一个 List<User>,每次测试前用 @BeforeEach 添加数据,结束后就该清空:
@BeforeEach
void setUp() {
users.add(new User("test1"));
}
@AfterEach
void cleanUp() {
users.clear(); // 防止下一个测试看到上一个测试留下的数据
}
2. 重置 Mock 行为
避免前一个测试对 Mock 的 stubbing 影响后续测试:
@AfterEach
void resetMocks() {
reset(userRepository, emailService);
}
3. 关闭临时文件或 IO 资源
尤其在涉及 FileWriter、BufferedWriter 等场景下:
@AfterEach
void closeFiles() {
if (writer != null) {
try { writer.close(); } catch (IOException ignored) {}
}
}
和 @AfterAll 的区别
@AfterEach 每个测试方法后都执行一次,适合清理**实例级**资源;@AfterAll 在整个测试类所有方法执行完后只执行一次,适合清理**静态/全局级**资源(如嵌入式数据库、共享线程池),且必须搭配 static 方法使用。别混淆两者作用域。


















