1. @BeforeEach 和 @BeforeAll
@BeforeEach
-
作用:
- 在每个测试方法执行之前运行。
- 用于初始化测试所需的环境或资源。
-
生命周期:
- 每次测试方法运行前都会执行一次。
-
适用场景:
- 用于设置每个测试方法所需的独立环境。
- 例如,重置状态、初始化依赖、配置 Mock 数据等。
示例
@BeforeEach
public void setup() {
System.out.println("Running @BeforeEach");
// 初始化逻辑
}
输出:
Running @BeforeEach
Running test1
Running @BeforeEach
Running test2
@BeforeAll
-
作用:
- 在所有测试方法执行之前运行一次。
- 用于初始化全局资源或配置。
-
生命周期:
- 在测试类加载时执行一次,所有测试方法共享其结果。
-
适用场景:
- 用于设置所有测试方法共享的全局环境。
- 例如,启动数据库连接、启动 Mock 服务、加载配置文件等。
注意
@BeforeAll方法必须是static的(除非测试类使用了@TestInstance(TestInstance.Lifecycle.PER_CLASS))。
示例
@BeforeAll
public static void globalSetup() {
System.out.println("Running @BeforeAll");
// 全局初始化逻辑
}
输出:
Running @BeforeAll
Running test1
Running test2
2. @AfterEach 和 @AfterAll
@AfterEach
-
作用:
- 在每个测试方法执行之后运行。
- 用于清理测试方法使用的资源或状态。
-
生命周期:
- 每次测试方法运行后都会执行一次。
-
适用场景:
- 用于清理每个测试方法的独立资源。
- 例如,重置 Mock 服务、清理临时文件、关闭连接等。
示例
@AfterEach
public void tearDown() {
System.out.println("Running @AfterEach");
// 清理逻辑
}
输出:
Running test1
Running @AfterEach
Running test2
Running @AfterEach
@AfterAll
-
作用:
- 在所有测试方法执行之后运行一次。
- 用于清理全局资源或状态。
-
生命周期:
- 在测试类运行完成后执行一次。
-
适用场景:
- 用于清理所有测试方法共享的全局资源。
- 例如,关闭数据库连接、停止 Mock 服务、清理全局缓存等。
注意
@AfterAll方法必须是static的(除非测试类使用了@TestInstance(TestInstance.Lifecycle.PER_CLASS))。
示例
@AfterAll
public static void globalTearDown() {
System.out.println("Running @AfterAll");
// 全局清理逻辑
}
输出:
Running test1
Running test2
Running @AfterAll
3. 对比总结
| 注解 | 作用 | 执行时机 | 是否必须 static |
|---|---|---|---|
@BeforeEach | 在每个测试方法之前运行,用于初始化每个测试方法的独立环境。 | 每个测试方法运行前 | 否 |
@BeforeAll | 在所有测试方法之前运行一次,用于初始化全局资源或配置。 | 测试类加载时 | 是(除非使用 PER_CLASS) |
@AfterEach | 在每个测试方法之后运行,用于清理每个测试方法的独立资源。 | 每个测试方法运行后 | 否 |
@AfterAll | 在所有测试方法之后运行一次,用于清理全局资源或状态。 | 测试类运行完成后 | 是(除非使用 PER_CLASS) |
4. @BeforeAll 和 @AfterAll 的非 static 用法
如果你不想让 @BeforeAll 和 @AfterAll 方法是 static 的,可以通过在测试类上添加 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 来实现。
示例
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {
@BeforeAll
public void setup() {
System.out.println("Running @BeforeAll (non-static)");
}
@AfterAll
public void tearDown() {
System.out.println("Running @AfterAll (non-static)");
}
@Test
public void test1() {
System.out.println("Running test1");
}
@Test
public void test2() {
System.out.println("Running test2");
}
}
输出:
Running @BeforeAll (non-static)
Running test1
Running test2
Running @AfterAll (non-static)
5. 使用场景总结
@BeforeEach 和 @AfterEach
-
适合:
-
每个测试方法需要独立的初始化和清理。
-
例如:
- 初始化 Mock 数据。
- 清理每个测试方法的临时文件。
-
@BeforeAll 和 @AfterAll
-
适合:
-
所有测试方法共享的全局资源或配置。
-
例如:
- 启动和停止数据库或 Mock 服务。
- 加载和清理全局配置文件。
-
6. 示例:完整的测试类
import org.junit.jupiter.api.*;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {
@BeforeAll
public void globalSetup() {
System.out.println("Running @BeforeAll");
}
@BeforeEach
public void setup() {
System.out.println("Running @BeforeEach");
}
@Test
public void test1() {
System.out.println("Running test1");
}
@Test
public void test2() {
System.out.println("Running test2");
}
@AfterEach
public void tearDown() {
System.out.println("Running @AfterEach");
}
@AfterAll
public void globalTearDown() {
System.out.println("Running @AfterAll");
}
}
输出
Running @BeforeAll
Running @BeforeEach
Running test1
Running @AfterEach
Running @BeforeEach
Running test2
Running @AfterEach
Running @AfterAll
7. 总结
-
@BeforeEach和@AfterEach:- 用于每个测试方法的独立初始化和清理。
- 不需要是
static方法。
-
@BeforeAll和@AfterAll:- 用于所有测试方法共享的全局初始化和清理。
- 默认需要是
static方法,但可以通过@TestInstance(TestInstance.Lifecycle.PER_CLASS)取消此限制。