@BeforeEach 是 JUnit 5 中标记测试前初始化方法的注解,要求为 public void 无参实例方法,每个 @Test 前执行一次以保证测试隔离;常用于创建对象、重置 mock、清空缓存等,不可耗时或修改静态状态,区别于只执行一次的 static @BeforeAll。

@BeforeEach 是 JUnit 5 中的注解,用于标记一个方法在每个 @Test 方法执行前自动运行,常用来做测试前的初始化工作,比如创建对象、准备测试数据、启动模拟服务等。
作用范围和基本用法
被 @BeforeEach 标记的方法必须是 public void 类型、无参数 的实例方法(不能是 static)。它会在当前测试类中的每一个测试方法运行前执行一次,确保每个测试都从干净、一致的状态开始。
示例:
class UserServiceTest {
private UserService userService;
private List<user> testData;
@BeforeEach
void setUp() {
userService = new UserService();
testData = Arrays.asList(
new User(1L, "Alice"),
new User(2L, "Bob")
);
}
@Test
void shouldFindUserById() {
User user = userService.findById(1L);
assertNotNull(user);
assertEquals("Alice", user.getName());
}
@Test
void shouldReturnEmptyWhenIdNotFound() {
User user = userService.findById(999L);
assertNull(user);
}
}
</user>
上面例子中,每次测试前都会重建 userService 和 testData,避免测试间相互干扰。
常见初始化场景
-
重置 mock 对象:用
Mockito.reset()清空行为记录,防止上一个测试影响下一个 -
清空内存数据库或缓存:比如调用
repository.deleteAll()或cache.clear() -
设置共享的测试上下文:如初始化
ObjectMapper、RestTemplate或自定义工具类实例 -
准备临时文件或目录:用
Files.createTempDirectory()创建隔离路径,测试后在@AfterEach中删除
注意事项
- 不要在
@BeforeEach中做耗时操作(如启动 HTTP 服务、读大文件),否则会拖慢整个测试套件;这类操作更适合放在@BeforeAll - 如果初始化逻辑复杂或需要异常处理,建议把核心逻辑提取成私有方法,保持
@BeforeEach方法简洁 - 避免在
@BeforeEach中修改静态变量或全局状态,容易引发测试污染 - 与 JUnit 4 的
@Before功能相同,但不可混用——JUnit 5 不识别@Before
和 @BeforeAll 的区别
@BeforeAll 方法只执行一次,在所有测试方法之前运行,适合一次性开销大的初始化(如启动嵌入式数据库、加载配置)。它必须是 static 方法。而 @BeforeEach 每次测试都执行,更强调“隔离性”和“可重复性”。两者常配合使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











