@BeforeAll 和 @AfterAll 是 JUnit 5 中用于类级别一次性初始化与清理的静态方法注解,必须为 public static void 且无参数,执行于所有测试前/后,适用于高开销资源如嵌入式数据库、WebMockServer 等。

@BeforeAll 和 @AfterAll 是 JUnit 5 中用于类级别一次性初始化与清理的核心注解,适合处理数据库连接、嵌入式服务、共享配置等高开销资源。
必须是静态方法
这两个方法必须声明为 public static void,且无参数。JUnit 在创建任何测试实例前就要执行它们,所以不能依赖对象实例——非静态方法需要先 new 出对象,时机上无法保证。
- 不加 static 会直接编译失败或运行时报错“Method must be static”
- 若确实需要访问实例字段(比如复用某个对象),可配合 @TestInstance(TestInstance.Lifecycle.PER_CLASS),此时@BeforeAll/@AfterAll 可去掉 static,但整个测试类只被实例化一次
典型使用场景与写法
常见用途包括启动嵌入式数据库、开启 WebMockServer、加载全局配置文件等。
- 用 static 字段保存共享资源(如 H2 Server 实例、DataSource)
- @BeforeAll 中完成初始化并赋值;@AfterAll 中做判空和关闭操作
- 异常要显式处理:@BeforeAll 抛出未捕获异常会导致所有测试跳过;@AfterAll 异常仅记录警告,不影响其他逻辑
执行顺序与限制
执行流程严格固定:@BeforeAll → 所有 @Test(按自然顺序或指定排序)→ @AfterAll。
- 每个测试类中最多只能有一个 @BeforeAll 方法和一个 @AfterAll 方法
- 它们不属于单个测试方法的生命周期,而是覆盖整个测试类的生命周期
- 不适合做测试数据准备或状态重置——这类任务应交给 @BeforeEach / @AfterEach
简单示例:启动并关闭 H2 数据库
以下代码在所有测试开始前启动 TCP 模式 H2 服务,结束后关闭:
@SpringBootTest
class UserRepositoryTest {
private static Server h2Server;
@BeforeAll
static void startH2Server() {
h2Server = Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
h2Server.start();
}
@Test
void shouldFindUserById() {
// 测试逻辑,通过 JDBC 访问 h2:tcp://localhost:9092/test
}
@AfterAll
static void stopH2Server() {
if (h2Server != null && h2Server.isRunning()) {
h2Server.stop();
}
}
}


















