Files
2025-11-29 18:28:34 +08:00

3.4 KiB

Spring Boot Test API Reference

Test Annotations

Spring Boot Test Annotations:

  • @SpringBootTest: Load full application context (use sparingly)
  • @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT): Full test with random HTTP port
  • @SpringBootTest(webEnvironment = WebEnvironment.MOCK): Full test with mock web environment
  • @DataJpaTest: Load only JPA components (repositories, entities)
  • @WebMvcTest: Load only MVC layer (controllers, @ControllerAdvice)
  • @WebFluxTest: Load only WebFlux layer (reactive controllers)
  • @JsonTest: Load only JSON serialization components
  • @RestClientTest: Load only REST client components
  • @AutoConfigureMockMvc: Provide MockMvc bean in @SpringBootTest
  • @AutoConfigureWebTestClient: Provide WebTestClient bean for WebFlux tests
  • @AutoConfigureTestDatabase: Control test database configuration

Testcontainer Annotations:

  • @ServiceConnection: Wire Testcontainer to Spring Boot test (Spring Boot 3.5+)
  • @DynamicPropertySource: Register dynamic properties at runtime
  • @Container: Mark field as Testcontainer (requires @Testcontainers)
  • @Testcontainers: Enable Testcontainers lifecycle management

Test Lifecycle Annotations:

  • @BeforeEach: Run before each test method
  • @AfterEach: Run after each test method
  • @BeforeAll: Run once before all tests in class (must be static)
  • @AfterAll: Run once after all tests in class (must be static)
  • @DisplayName: Custom test name for reports
  • @Disabled: Skip test
  • @Tag: Tag tests for selective execution

Test Isolation Annotations:

  • @DirtiesContext: Clear Spring context after test (forces rebuild)
  • @DirtiesContext(classMode = ClassMode.AFTER_CLASS): Clear after entire class

Common Test Utilities

MockMvc Methods:

  • mockMvc.perform(get("/path")): Perform GET request
  • mockMvc.perform(post("/path")).contentType(MediaType.APPLICATION_JSON): POST with content type
  • .andExpect(status().isOk()): Assert HTTP status
  • .andExpect(content().contentType("application/json")): Assert content type
  • .andExpect(jsonPath("$.field").value("expected")): Assert JSON path value

TestRestTemplate Methods:

  • restTemplate.getForEntity("/path", String.class): GET request
  • restTemplate.postForEntity("/path", body, String.class): POST request
  • response.getStatusCode(): Get HTTP status
  • response.getBody(): Get response body

WebTestClient Methods (Reactive):

  • webTestClient.get().uri("/path").exchange(): Perform GET request
  • .expectStatus().isOk(): Assert status
  • .expectBody().jsonPath("$.field").isEqualTo(value): Assert JSON

Test Slices Performance Guidelines

  • Unit tests: Complete in <50ms each
  • Integration tests: Complete in <500ms each
  • Maximize context caching by grouping tests with same configuration
  • Reuse Testcontainers at JVM level where possible

Common Test Annotations Reference

Annotation Purpose When to Use
@SpringBootTest Full application context Full integration tests only
@DataJpaTest JPA components only Repository and entity tests
@WebMvcTest MVC layer only Controller tests
@WebFluxTest WebFlux layer only Reactive controller tests
@ServiceConnection Container integration Spring Boot 3.5+ with Testcontainers
@DynamicPropertySource Dynamic properties Pre-3.5 or custom configuration
@DirtiesContext Context cleanup When absolutely necessary