@beforeeach 是 junit 5 中在每个@test方法执行前调用一次的注解,用于初始化对象、mock、数据库连接等,要求void返回、非static、无参数,异常会导致测试失败。

@BeforeEach 是 JUnit 5 中用于在每个测试方法执行前自动运行的注解,常用来做测试前的数据初始化、对象创建、数据库连接、Mock 设置等准备工作。
作用范围和执行时机
被 @BeforeEach 标记的方法会在当前测试类中的每一个 @Test 方法执行前调用一次,且按定义顺序执行(如果多个@BeforeEach方法,按声明顺序)。
- 适用于需要“干净状态”的场景:比如每次测试都要一个新实例、清空缓存、重置计数器、插入测试数据等
- 不能带参数,不能是 static 方法,返回类型必须是 void
- 若抛出异常,该测试方法不会执行,会直接标记为失败
典型使用方式:初始化测试依赖对象
例如测试一个用户服务,每次测试前都新建 UserService 和模拟的 UserRepository:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
class UserServiceTest {
private UserService userService;
private UserRepository userRepository;
@BeforeEach
void setUp() {
userRepository = mock(UserRepository.class);
userService = new UserService(userRepository);
}
@Test
void shouldReturnUserWhenIdExists() {
when(userRepository.findById(1L)).thenReturn(Optional.of(new User("Alice")));
assertThat(userService.findUserById(1L)).isPresent();
}
@Test
void shouldReturnEmptyWhenIdNotExists() {
when(userRepository.findById(2L)).thenReturn(Optional.empty());
assertThat(userService.findUserById(2L)).isEmpty();
}
}
这样两个测试都拥有独立、隔离的 mock 对象,互不影响。
配合 @AfterEach 实现资源清理
如果@BeforeEach中打开了文件、启动了线程、占用了端口等,建议用 @AfterEach 做对应清理:
- 比如创建临时文件夹,@BeforeEach 中用 Files.createTempDirectory;@AfterEach 中递归删除
- 比如使用嵌入式数据库(H2),@BeforeEach 初始化 schema,@AfterEach 执行 TRUNCATE 或关闭连接
- 注意:@AfterEach 在每个@Test后执行,即使测试失败也会运行(适合释放资源)
常见误区提醒
- 不要在 @BeforeEach 里做耗时操作(如远程调用、读大文件),否则拖慢整个测试套件
- @BeforeEach 不替代 @BeforeAll —— 后者只运行一次,适合共享的昂贵资源(如启动 Spring 上下文)
- 避免在 @BeforeEach 中修改静态变量或共享单例,容易导致测试间干扰
- 如果初始化逻辑复杂,可封装成私有工具方法,保持 @BeforeEach 简洁可读
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










