Diese Seite bleibt auch ohne JavaScript lesbar. Suche und Buttons sind Zusatzkomfort.
Spring Testing im Enterprise-Alltag
Teststrategie mit Unit Tests, Slice Tests, Integration Tests, Contract Tests und Testdatenkontrolle.
1. Nicht jeder Test braucht den ganzen Spring Context
Ein häufiger Fehler ist, jede Kleinigkeit mit @SpringBootTest zu testen. Das ist langsam und macht Tests fragil. Domain-Regeln brauchen oft gar keinen Spring Context. Controller-Mapping kann mit @WebMvcTest getestet werden. JPA-Mapping mit @DataJpaTest. Die vollständige Anwendung wird gezielt mit @SpringBootTest getestet.
Senior-Regel: Je fachlicher und kleiner die Regel, desto weniger Framework. Je mehr Infrastruktur und Wiring, desto mehr Spring-Testunterstützung.
class OrderTest {
@Test
void submittedOrderCanBeApproved() {
Order order = Order.submit(CustomerId.of("C-42"), List.of(line("SKU-1")));
order.approve();
assertThat(order.status()).isEqualTo(OrderStatus.APPROVED);
}
}
@WebMvcTest(OrderController.class)
class OrderControllerTest {
@Autowired MockMvc mvc;
@MockBean PlaceOrderUseCase placeOrder;
@Test
void returnsCreated() throws Exception {
when(placeOrder.place(any())).thenReturn(OrderId.of("O-100"));
mvc.perform(post("/api/orders")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"customerId":"C-42","lines":[{"sku":"SKU-1","qty":2}]}"""))
.andExpect(status().isCreated());
}
}
2. Testcontainers für echte Infrastruktur
Mocks sind gut für fachliche Entscheidungen. Für SQL, Transaktionen, Migrationen und Container-Infrastruktur sind echte Abhängigkeiten oft realistischer. Testcontainers hilft, PostgreSQL, Kafka, Redis oder andere Systeme reproduzierbar im Test zu starten.
@DataJpaTest
@Testcontainers
class OrderRepositoryTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");
@DynamicPropertySource
static void datasource(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
}
3. Contract Tests
Wenn Teams unabhängig deployen, reicht ein grüner Provider-Test nicht. Consumer-driven Contracts beschreiben die Erwartungen des Consumers und prüfen, ob Provider und Client noch kompatibel sind.
Enterprise-Prüffragen
- Domain-Regeln ohne Spring testbar?
- Slice Tests statt überall @SpringBootTest?
- Echte DB-Migrationen getestet?
- Verträge zwischen Services abgesichert?