Java Academy · Lektion

Spring Boot-test slices: @WebMvcTest og @DataJpaTest

Brug @WebMvcTest til at teste controllere isoleret og @DataJpaTest til at teste repository-laget.

Lektion 3 af 413 trin

Spring Boot-test slices: @WebMvcTest og @DataJpaTest er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad er testudsnit?

Testudsnit indlæser kun den relevante del af Spring-konteksten for et bestemt lag. De er hurtigere end @SpringBootTest, som indlæser alt, og isolerer det lag, du tester.

@WebMvcTest: Kun controllerlaget

@WebMvcTest(UserController.class) indlæser kun web-laget: controllere, filtre, sikkerhedskonfiguration og Jackson. Tjenester og repositories skal simuleres med @MockBean.

@WebMvcTest(UserController.class)
class UserControllerTest {
    @Autowired MockMvc mockMvc;
    @MockBean UserService userService;
    @Test
    void get_user_returns_200() throws Exception {
        given(userService.findById(1L)).willReturn(new UserDto(1L, "Alice"));
        mockMvc.perform(get("/api/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("Alice"));
    }
}

Opbygning af MockMvc-forespørgsler

Opbyg forespørgsler med MockMvcRequestBuilders. Angiv headere, indholdstype og forespørgslens indhold til POST- og PUT-tests.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"Bob","email":"bob@example.com"}"""))
    .andExpect(status().isCreated())
    .andExpect(header().exists("Location"));

Test af validering i @WebMvcTest

Ugyldigt forespørgselsindhold udløser MethodArgumentNotValidException. Kontrollér status 400 og fejlresponsens indhold.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"","email":"bad"}"""))
    .andExpect(status().isBadRequest())
    .andExpect(jsonPath("$.errors.name").exists());

@DataJpaTest: Kun repositorylaget

@DataJpaTest indlæser JPA-repositories, den indlejrede H2-database, Hibernate og en TestEntityManager. Andre bønner, f.eks. tjenester og webkomponenter, indlæses ikke.

@DataJpaTest
class UserRepositoryTest {
    @Autowired UserRepository repo;
    @Autowired TestEntityManager em;
    @Test
    void find_by_email() {
        em.persist(new User("Alice", "alice@example.com"));
        em.flush();
        Optional<User> found = repo.findByEmail("alice@example.com");
        assertTrue(found.isPresent());
    }
}

TestEntityManager

TestEntityManager indpakker EntityManager med praktiske metoder: persist(), flush(), find(), persistAndFlush().

User saved = em.persistAndFlush(new User("Bob", "bob@example.com"));
assertNotNull(saved.getId());
em.clear(); // detach all to force a real DB read
User fromDb = repo.findById(saved.getId()).orElseThrow();
assertEquals("Bob", fromDb.getName());

@DataJpaTest: Tilbagerulning

Hver test kører i en transaktion, der som standard rulles tilbage efter testen. Data bevares ikke mellem tests — det sikrer testisolering uden manuel oprydning.

@DataJpaTest  // each @Test is rolled back automatically
class OrderRepositoryTest {
    @Test @Transactional
    void count_orders_is_zero_by_default() {
        assertEquals(0, orderRepo.count());
    }
}

Udskiftning af H2 med en rigtig database i @DataJpaTest

Brug @AutoConfigureTestDatabase(replace = Replace.NONE) til at køre @DataJpaTest mod den rigtige database, der er konfigureret i application.properties, i stedet for H2.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
    // Uses the configured PostgreSQL, not H2
}

@JsonTest: Kun JSON-serialisering

@JsonTest indlæser Jackson-konfigurationen. Brug JacksonTester til at kontrollere, at objekter serialiseres og deserialiseres som forventet.

@JsonTest
class UserDtoJsonTest {
    @Autowired JacksonTester<UserDto> json;
    @Test
    void serializes_correctly() throws Exception {
        UserDto dto = new UserDto(1L, "Alice", "alice@example.com");
        assertThat(json.write(dto)).hasJsonPathStringValue("$.email");
    }
}

@RestClientTest: REST-klientlag

@RestClientTest tester HTTP-klienter, der er baseret på RestTemplate eller WebClient. Den konfigurerer en MockRestServiceServer til at simulere HTTP-responser.

@RestClientTest(WeatherClient.class)
class WeatherClientTest {
    @Autowired WeatherClient client;
    @Autowired MockRestServiceServer server;
    @Test
    void fetches_weather() {
        server.expect(requestTo("/api/weather")).andRespond(withSuccess("""{"temp":22}""", APPLICATION_JSON));
        Weather w = client.getWeather("Istanbul");
        assertEquals(22, w.getTemp());
    }
}

Kombination af testudsnit med @Import

Testudsnit udelader mange bønner efter designet. Brug @Import(SomeConfig.class) til at tilføje bestemte konfigurationsklasser, som testudsnittet har brug for.

@WebMvcTest(UserController.class)
@Import(SecurityConfig.class)  // load security for auth tests
class SecuredControllerTest { ... }

Hurtigt tjek

Hvilken database bruger @DataJpaTest som standard?

Opsummering

@WebMvcTest tester controllerlaget med MockMvc; simulér tjenester med @MockBean. @DataJpaTest tester repositories med TestEntityManager og automatisk tilbagerulning. Brug Replace.NONE til en rigtig database. Brug @JsonTest til serialisering og @RestClientTest til HTTP-klienter.

Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Spring Boot-test slices: @WebMvcTest og @DataJpaTest” gratis?

Ja — hele teksten til “Spring Boot-test slices: @WebMvcTest og @DataJpaTest” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Spring Boot-test slices: @WebMvcTest og @DataJpaTest”?

Brug @WebMvcTest til at teste controllere isoleret og @DataJpaTest til at teste repository-laget. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Spring Boot-test slices: @WebMvcTest og @DataJpaTest”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Parameteriserede tests med @CsvSource og @MethodSource
  2. Avanceret Mockito: ArgumentCaptors og spies
  3. Spring Boot-test slices: @WebMvcTest og @DataJpaTest
  4. Testcontainers: Integrationstests med en rigtig database
← Tilbage til Java Academy