Java Academy · leksjon

Testcontainers: integrasjonstester mot en ekte database

Start PostgreSQL i Docker med Testcontainers, og kjør integrasjonstester mot en ekte database.

Leksjon 4 av 413 trinn

Testcontainers: integrasjonstester mot en ekte database er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hvorfor Testcontainers?

H2-databaser i minnet støtter ikke PostgreSQL-spesifikke funksjoner (JSON, fulltekstsøk, ON CONFLICT). Testcontainers starter ekte Docker-containere under testene, slik at De får en database som er identisk med produksjonsdatabasen.

Legge til Testcontainers-avhengigheten

Legg til Testcontainers-BOM-en og PostgreSQL-modulen i build-filen. Spring Boot 3.1+ inkluderer en administrert Testcontainers-versjon.

// 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 og @Container

Annoter testklassen med @Testcontainers, og erklær containeren som et statisk felt med @Container. JUnit 5 starter og stopper den automatisk.

@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");
}

Konfigurere DataSource fra en container

Bruk @DynamicPropertySource for å legge containerens dynamiske port og påloggingsopplysninger inn i Spring-konfigurasjonen for DataSource.

@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+ konfigurerer automatisk DataSource fra en Testcontainers-@Container-bean annotert med @ServiceConnection — det er ikke nødvendig med @DynamicPropertySource.

@Bean
@ServiceConnection
static PostgreSQLContainer<?> postgresContainer() {
    return new PostgreSQLContainer<>("postgres:16-alpine");
}

Singleton-mønster for containere

Det går sakte å starte en container for hver testklasse. Del én container mellom alle testene ved å bruke et statisk felt med Startables.deepStart() eller en abstrakt basisklasse.

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);
    }
}

Testing av PostgreSQL-spesifikke funksjoner

Med Testcontainers kan De teste JSON-kolonner, JSONB-operatorer, fulltekstsøk og ON CONFLICT DO UPDATE — noe som er umulig med H2.

@Test
void jsonb_search_works() {
    // Insert row with JSONB column, then query
    List<Event> logins = repo.findByType("login");
    assertEquals(1, logins.size());
}

Flere containere: Compose

Bruk DockerComposeContainer til å kjøre en hel stakk (Postgres + Redis + Kafka) for integrasjonstester som krever flere tjenester.

@Container
static DockerComposeContainer<?> compose = new DockerComposeContainer<>(
    new File("src/test/resources/docker-compose.yml"))
    .withExposedService("postgres", 5432)
    .withExposedService("redis", 6379);

Ryuk: Automatisk opprydding

Testcontainers bruker en Ryuk-container til automatisk å stoppe og fjerne containere når JVM-en avsluttes — også når en test mislykkes. Dermed unngår De containere som blir stående.

<code>@SpringBootTest</code> med Testcontainers

Bruk @SpringBootTest i stedet for @DataJpaTest for å teste hele applikasjonsstakken (kontrollere, tjenester, repositories) mot en ekte Postgres-container.

@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());
    }
}

Bufring av containerbilder

Testcontainers bufrer nedlastede Docker-bilder lokalt. Last ned bildene i CI før testene kjører (docker pull postgres:16-alpine) for å unngå nedlasting under testkjøringen.

Hurtigsjekk

Hvilken annotasjon kobler automatisk en Testcontainers-container til Springs DataSource i Spring Boot 3.1+?

Oppsummering

Testcontainers kjører ekte Docker-containere for integrasjonstester. Bruk @Container + @DynamicPropertySource eller @ServiceConnection (Boot 3.1+). Del containere mellom tester med Singleton-mønsteret. Test PostgreSQL-spesifikke funksjoner som er umulige med H2.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Testcontainers: integrasjonstester mot en ekte database» gratis?

Ja – hele teksten i «Testcontainers: integrasjonstester mot en ekte database» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Testcontainers: integrasjonstester mot en ekte database»?

Start PostgreSQL i Docker med Testcontainers, og kjør integrasjonstester mot en ekte database. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Testcontainers: integrasjonstester mot en ekte database»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Parameteriserte tester med @CsvSource og @MethodSource
  2. Avansert Mockito: argumentfangere og spioner
  3. Spring Boot-testskiver: @WebMvcTest og @DataJpaTest
  4. Testcontainers: integrasjonstester mot en ekte database
← Tilbake til Java Academy