Spring Test / Testcontainers / Contract Tests

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.

Enterprise-Teststrategie: schnell breit, langsam gezielt Unit / Domain Slice Tests: WebMvc, DataJpa Integration / Contract / E2E Testcontainers für echte Infrastruktur, aber nicht für jede Kleinigkeit.
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.

Domain Unit Test ohne Spring
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);
    }
}
Web Slice Test
@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.

Data Test mit PostgreSQL Container
@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?