JUnit5 注解
核心测试注解
import org.junit.jupiter.api.*;
class CalculatorTest {
private Calculator calc;
@BeforeAll
static void initAll() {
// 在该类所有测试之前运行一次
System.out.println("测试套件开始");
}
@BeforeEach
void setUp() {
// 在每个测试方法之前运行
calc = new Calculator();
}
@Test
@DisplayName("加法:2 + 3 = 5")
void testAdd() {
assertEquals(5, calc.add(2, 3));
}
@AfterEach
void tearDown() {
calc = null;
}
@AfterAll
static void tearDownAll() {
System.out.println("测试套件完成");
}
}
@Nested — 层级结构测试
@DisplayName("UserService 测试")
class UserServiceTest {
@Nested
@DisplayName("当用户存在时")
class WhenUserExists {
@Test
void findById_returnsUser() {
assertNotNull(service.findById(user.getId()));
}
@Test
void delete_removesUser() {
service.delete(user.getId());
assertFalse(userRepo.existsById(user.getId()));
}
}
@Nested
@DisplayName("当用户不存在时")
class WhenUserNotFound {
@Test
void findById_throwsException() {
assertThrows(UserNotFoundException.class,
() -> service.findById(999L));
}
}
}
@Tag、@Disabled、@Timeout
@Tag("integration")
@Tag("database")
class DatabaseIntegrationTest {
@Test
@Tag("slow")
void largeDatasetQuery() { /* ... */ }
@Test
@Disabled("暂时禁用 — 见 JIRA-1234")
void brokenFeatureTest() { /* ... */ }
@Test
@Timeout(5) // 超过 5 秒则失败
void apiCallShouldBeQuick() throws Exception { }
}
// Maven 运行指定标签:
// mvn test -Dgroups="integration"
// mvn test -DexcludedGroups="slow"
@ExtendWith — 扩展
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class PaymentServiceTest {
@Mock
private PaymentGateway gateway;
@InjectMocks
private PaymentService service;
@Test
void chargeCard_callsGateway() {
when(gateway.charge(any())).thenReturn(new ChargeResult("ch_1"));
service.processPayment(new Order(100.0));
verify(gateway, times(1)).charge(any());
}
}
注解速查表
| 注解 | 生命周期 | 说明 |
|---|---|---|
@Test | 每个测试 | 标记方法为测试方法 |
@BeforeEach | 每次测试前 | 初始化/重置状态 |
@AfterEach | 每次测试后 | 清理/拆解 |
@BeforeAll | 所有测试前一次 | 须为 static(PER_CLASS 除外) |
@AfterAll | 所有测试后一次 | 须为 static(PER_CLASS 除外) |
@Nested | 类级别 | 分组相关测试 |
@Tag | 类/方法 | 运行时按标签过滤 |
@Disabled | 类/方法 | 跳过测试 |
@ExtendWith | 类级别 | 注册扩展 |