@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、加载全局配置文件等。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 用 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();
}
}
}










