74 lines
3.4 KiB
Markdown
74 lines
3.4 KiB
Markdown
# 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 | |