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类级别注册扩展