@BeforeEach 是 JUnit 5 中用于每个@Test前执行的非静态、无参、void方法,确保测试间隔离;常用于新建对象、清空集合、重置状态等轻量初始化。

@BeforeEach 是 JUnit 5 中用于在每个 @Test 方法执行前自动运行的初始化方法,适合准备独属于单个测试用例的前置数据,比如新建对象、重置状态、构造测试输入等。
核心要求和写法
它必须是实例方法(不能加 static),且返回类型为 void,无参数。JUnit 会为每个测试方法单独调用一次该方法,确保各测试之间互不干扰。
- 方法上标注
@BeforeEach - 不能是
static,否则编译报错 - 通常用来创建新实例、清空集合、设置默认字段值等轻量级操作
典型使用场景
适用于每次测试都需要干净、独立起点的情况,例如:
- 为每个测试新建一个被测对象(如
Calculator calculator = new Calculator();) - 初始化一个空的
List或Map供当前测试填充和验证 - 重置静态计数器或共享标志位(如果测试逻辑依赖它)
- 设置模拟对象(Mock)的行为,避免不同测试间行为串扰
简单示例
假设测试一个计数器类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
public class Counter {
private int count = 0;
public void increment() { count++; }
public int getCount() { return count; }
}
对应测试可这样写:
class CounterTest {
private Counter counter;
@BeforeEach
void setUp() {
counter = new Counter(); // 每个@Test前都新建一个干净实例
}
@Test
void testIncrementOnce() {
counter.increment();
assertEquals(1, counter.getCount());
}
@Test
void testIncrementTwice() {
counter.increment();
counter.increment();
assertEquals(2, counter.getCount());
}
}
两个测试各自拥有独立的 counter,互不影响。
注意和常见误区
@BeforeEach 不适合耗时或全局性操作,比如连接数据库、读大文件、启动服务——这类应改用 @BeforeAll。另外,它无法替代测试内的局部初始化;若某次测试需要特殊数据,仍应在测试方法内单独构造。

















