Testcontainers: Integrationstests mit echter Datenbank
Starten Sie PostgreSQL in Docker mit Testcontainers und führen Sie Integrationstests gegen eine echte Datenbank aus.
Testcontainers: Integrationstests mit echter Datenbank ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Testcontainers?
In-Memory-Datenbanken wie H2 unterstützen PostgreSQL-spezifische Funktionen wie JSON, die Volltextsuche und ON CONFLICT nicht. Testcontainers startet während der Tests echte Docker-Container und stellt Ihnen dadurch eine produktionsgleiche Datenbank bereit.
Testcontainers-Abhängigkeit hinzufügen
Fügen Sie die Testcontainers-BOM und das PostgreSQL-Modul zu Ihrer Build-Datei hinzu. Spring Boot 3.1 und höher enthält eine verwaltete Testcontainers-Version.
// build.gradle:
testImplementation "org.testcontainers:junit-jupiter"
testImplementation "org.testcontainers:postgresql"
// Optionally use Spring Boot Testcontainers support:
testImplementation "org.springframework.boot:spring-boot-testcontainers"@Testcontainers und @Container
Annotieren Sie die Testklasse mit @Testcontainers und deklarieren Sie den Container als statisches @Container-Feld. JUnit 5 startet und beendet ihn automatisch.
@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
}DataSource aus dem Container konfigurieren
Verwenden Sie @DynamicPropertySource, um den dynamischen Port und die Zugangsdaten des Containers in die DataSource-Konfiguration von Spring einzuspeisen.
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}Spring Boot 3.1 ServiceConnection
Spring Boot 3.1+ konfiguriert die DataSource automatisch anhand einer mit @ServiceConnection annotierten Testcontainers-@Container-Bean – @DynamicPropertySource ist nicht erforderlich.
@Bean
@ServiceConnection
static PostgreSQLContainer<?> postgresContainer() {
return new PostgreSQLContainer<>("postgres:16-alpine");
}Singleton-Container-Muster
Pro Testklasse einen Container zu starten, ist langsam. Teilen Sie einen Container über ein statisches Feld mit allen Tests, indem Sie Startables.deepStart() oder eine abstrakte Basisklasse verwenden.
abstract class AbstractIntegrationTest {
@Container
static final PostgreSQLContainer<?> POSTGRES =
new PostgreSQLContainer<>("postgres:16-alpine").withReuse(true);
static { POSTGRES.start(); }
@DynamicPropertySource
static void props(DynamicPropertyRegistry r) {
r.add("spring.datasource.url", POSTGRES::getJdbcUrl);
r.add("spring.datasource.username", POSTGRES::getUsername);
r.add("spring.datasource.password", POSTGRES::getPassword);
}
}PostgreSQL-spezifische Funktionen testen
Mit Testcontainers können Sie JSON-Spalten, JSONB-Operatoren, die Volltextsuche und ON CONFLICT DO UPDATE testen – mit H2 ist das nicht möglich.
@Test
void jsonb_search_works() {
// Insert row with JSONB column, then query
List<Event> logins = repo.findByType("login");
assertEquals(1, logins.size());
}Mehrere Container: Compose
Verwenden Sie DockerComposeContainer, um für Integrationstests, die mehrere Dienste benötigen, einen vollständigen Stack (Postgres + Redis + Kafka) auszuführen.
@Container
static DockerComposeContainer<?> compose = new DockerComposeContainer<>(
new File("src/test/resources/docker-compose.yml"))
.withExposedService("postgres", 5432)
.withExposedService("redis", 6379);Ryuk: Automatische Bereinigung
Testcontainers verwendet einen Ryuk-Container, um Container beim Beenden der JVM automatisch zu stoppen und zu entfernen – auch wenn ein Test fehlschlägt. So werden Container-Leaks verhindert.
<code>@SpringBootTest</code> mit Testcontainers
Verwenden Sie @SpringBootTest statt @DataJpaTest, um den vollständigen Anwendungs-Stack (Controller, Services, Repositories) mit einem echten Postgres-Container zu testen.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
class FullIntegrationTest extends AbstractIntegrationTest {
@LocalServerPort int port;
@Autowired TestRestTemplate rest;
@Test
void end_to_end_user_creation() {
ResponseEntity<UserDto> r = rest.postForEntity("/api/users", createReq(), UserDto.class);
assertEquals(HttpStatus.CREATED, r.getStatusCode());
}
}Caching von Container-Images
Testcontainers speichert heruntergeladene Docker-Images lokal zwischen. Laden Sie die Images in der CI vor dem Start der Tests herunter (docker pull postgres:16-alpine), um den Downloadaufwand während der Testausführung zu vermeiden.
Kurzer Test
Welche Annotation verbindet einen Testcontainers-Container in Spring Boot 3.1+ automatisch mit der DataSource von Spring?
Zusammenfassung
Testcontainers führt echte Docker-Container für Integrationstests aus. Verwenden Sie @Container + @DynamicPropertySource oder @ServiceConnection (Boot 3.1+). Teilen Sie Container mithilfe des Singleton-Musters zwischen Tests. Testen Sie PostgreSQL-spezifische Funktionen, die mit H2 nicht möglich sind.
Häufig gestellte Fragen
Ist die Lektion „Testcontainers: Integrationstests mit echter Datenbank“ kostenlos?
Ja — der vollständige Text von „Testcontainers: Integrationstests mit echter Datenbank“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Testcontainers: Integrationstests mit echter Datenbank“?
Starten Sie PostgreSQL in Docker mit Testcontainers und führen Sie Integrationstests gegen eine echte Datenbank aus. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Testcontainers: Integrationstests mit echter Datenbank“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Parametrisierte Tests mit @CsvSource und @MethodSource
- Mockito für Fortgeschrittene: Argument-Captoren und Spies
- Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest
- Testcontainers: Integrationstests mit echter Datenbank