Testing i praksis: JUnit, Mockito og integrasjonstester · leksjon

Innebygde databaser for testing

Konfigurer og bruk minnebaserte eller innebygde databaser for rask og isolert integrasjonstesting.

Leksjon 3 av 411 trinn

Innebygde databaser for testing er en gratis leksjon i Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Testing i praksis: JUnit, Mockito og integrasjonstester, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Innebygde databaser for tester

Når De skriver integrasjonstester for Spring Boot-applikasjoner, særlig tester som samhandler med en database, trenger De en databaseinstans som testene kan kjøre mot.

Innebygde databaser tilbyr en lettvektsløsning i minnet som passer perfekt til dette scenarioet.

Hvorfor bruke innebygde databaser?

Innebygde databaser gir flere viktige fordeler ved testing:

  • Isolasjon: Hver testkjøring får en ren og ny database, noe som hindrer bieffekter.
  • Hastighet: Siden de ligger i minnet, er de svært raske og reduserer testkjøringstiden.
  • Enkelhet: Det er ikke nødvendig med eksterne databaseservere eller komplisert oppsett.
  • Repeterbarhet: Testene blir konsistente fordi de alltid starter med samme datatilstand.

Alternativer for H2 og HSQLDB

To populære valg for innebygde databaser i Java-applikasjoner er H2 Database og HSQLDB.

  • H2: En rask, åpen kildekode-basert, JDBC-kompatibel database i minnet. Den brukes mye sammen med Spring Boot.
  • HSQLDB: En annen lettvekts relasjonsdatabase skrevet i Java.

Vi fokuserer på H2, siden den er et vanlig standardvalg i Spring Boot.

Legge til H2-avhengigheten

For å bruke H2 i Spring Boot-prosjektet Deres legger De vanligvis til H2 som en avhengighet med test-omfang i pom.xml (for Maven) eller build.gradle (for Gradle).

Dette sikrer at den bare er tilgjengelig under testing.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>

Automatisk konfigurasjon i Spring Boot

Et av Spring Boots magiske triks er automatisk konfigurasjon. Når Spring Boot oppdager H2 på klassestien under tester, konfigurerer det automatisk en H2-database i minnet for Dem.

De trenger ofte ikke å angi en database-URL i application.properties for tester, noe som gjør oppsettet svært enkelt!

User-entitet og repository

La oss se på en enkel User-entitet og et UserRepository. Vi ønsker å teste om repository-et lagrer og henter brukere riktig.

Dette er standard JPA-komponenter.

// User.java
package com.coddykit.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    public User() {}
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getters and Setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

// UserRepository.java
package com.coddykit.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByName(String name);
}

@DataJpaTest med H2

Spring Boot tilbyr @DataJpaTest spesielt for testing av JPA-komponenter. Den konfigurerer automatisk en database i minnet, for eksempel H2 hvis den finnes, og en EntityManager.

Den ruller også tilbake transaksjoner etter hver test, slik at tilstanden forblir ren.

Eksempel på UserRepository-test

Slik kan De skrive en integrasjonstest for UserRepository ved hjelp av H2 og @DataJpaTest:

package com.coddykit.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import static org.assertj.core.api.Assertions.assertThat;

@DataJpaTest
class UserRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private UserRepository userRepository;

    @Test
    void whenFindByName_thenReturnUser() {
        // given
        User alice = new User("Alice", "alice@example.com");
        entityManager.persist(alice);
        entityManager.flush();

        // when
        User found = userRepository.findByName(alice.getName());

        // then
        assertThat(found.getName()).isEqualTo(alice.getName());
        assertThat(found.getEmail()).isEqualTo(alice.getEmail());
    }

    @Test
    void whenInvalidName_thenReturnNull() {
        // when
        User found = userRepository.findByName("InvalidName");

        // then
        assertThat(found).isNull();
    }
}

Initialisering av skjema og data

I mer komplekse scenarioer kan De måtte forhåndsfylle databasen i minnet med et skjema eller startdata.

  • Plasser schema.sql i src/test/resources for DDL (Data Definition Language).
  • Plasser data.sql i src/test/resources for DML (Data Manipulation Language).

Spring Boot finner og bruker disse automatisk i testene Deres.

Rask sjekk

Hvilket av følgende er IKKE en hovedfordel ved å bruke en innebygd database som H2 i Spring Boot-integrasjonstester?

Oppsummering og neste steg

Vi har utforsket hvordan innebygde databaser som H2 er svært nyttige for raske og isolerte Spring Boot-integrasjonstester.

  • De gir hastighet, isolasjon og enkelhet.
  • Spring Boot konfigurerer dem automatisk med minimal innsats.
  • @DataJpaTest forenkler testing av JPA-repositories med disse databasene.
  • De kan initialisere skjemaer og data ved hjelp av schema.sql og data.sql.

Deretter kan De utforske testing av RESTful-API-er med MockMvc!

Gratis å komme i gang

Lær deg Testing i praksis: JUnit, Mockito og integrasjonstester 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
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Innebygde databaser for testing» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Testing i praksis: JUnit, Mockito og integrasjonstester, inkludert «Innebygde databaser for testing», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Hva lærer jeg i «Innebygde databaser for testing»?

Konfigurer og bruk minnebaserte eller innebygde databaser for rask og isolert integrasjonstesting. Du øver på Testing i praksis: JUnit, Mockito og integrasjonstester 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 Testing i praksis: JUnit, Mockito og integrasjonstester?

Ingen tidligere erfaring er nødvendig. Testing i praksis: JUnit, Mockito og integrasjonstester 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 3 av 4.

Hvor lang tid tar leksjonen «Innebygde databaser for testing»?

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 Testing i praksis: JUnit, Mockito og integrasjonstester-leksjonen?

Ja. Alle Testing i praksis: JUnit, Mockito og integrasjonstester-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. Spring Test Context Framework
  2. Testing av RESTful-API-er
  3. Innebygde databaser for testing
  4. Testing av web-lag med @WebMvcTest og MockMvc
← Tilbake til Testing i praksis: JUnit, Mockito og integrasjonstester