0Pricing
Java Academy · Lektion

Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest

Verwenden Sie @WebMvcTest, um Controller isoliert zu testen, und @DataJpaTest für Tests der Repository-Schicht.

Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Was sind Test-Slices?

Test-Slices laden nur den für eine bestimmte Schicht relevanten Teil des Spring-Kontexts. Sie sind schneller als @SpringBootTest, das den gesamten Kontext lädt, und isolieren die zu testende Schicht.

@WebMvcTest: Nur die Controller-Schicht

@WebMvcTest(UserController.class) lädt nur die Web-Schicht: Controller, Filter, Security-Konfiguration und Jackson. Services und Repositories müssen mit @MockBean gemockt werden.

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

MockMvc-Anfragen erstellen

Erstellen Sie Anfragen mit MockMvcRequestBuilders. Legen Sie für POST-/PUT-Tests Header, Content-Type und Request-Body fest.

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

Validierung in @WebMvcTest testen

Ungültige Request-Bodies lösen MethodArgumentNotValidException aus. Überprüfen Sie den Status 400 und den Fehler-Response-Body.

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

@DataJpaTest: Nur die Repository-Schicht

@DataJpaTest lädt JPA-Repositories, die eingebettete H2-Datenbank, Hibernate und einen TestEntityManager. Andere Beans wie Services und Web-Komponenten werden nicht geladen.

@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 umschließt EntityManager und stellt praktische Hilfsmethoden bereit: 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());

Rollback bei @DataJpaTest

Jeder Test läuft standardmäßig in einer Transaktion, die nach dem Test zurückgerollt wird. Daten bleiben zwischen Tests nicht bestehen – dadurch ist die Testisolation ohne manuelle Bereinigung gewährleistet.

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

H2 in @DataJpaTest durch eine echte Datenbank ersetzen

Verwenden Sie @AutoConfigureTestDatabase(replace = Replace.NONE), um @DataJpaTest mit der in application.properties konfigurierten echten Datenbank statt mit H2 auszuführen.

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

@JsonTest: Nur JSON-Serialisierung

@JsonTest lädt die Jackson-Konfiguration. Verwenden Sie JacksonTester, um zu überprüfen, dass Objekte wie erwartet serialisiert und deserialisiert werden.

@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-Client-Schicht

@RestClientTest testet HTTP-Clients auf Basis von RestTemplate oder WebClient. Die Annotation konfiguriert einen MockRestServiceServer, um HTTP-Antworten zu mocken.

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

Slices mit @Import kombinieren

Slices schließen absichtlich viele Beans aus. Verwenden Sie @Import(SomeConfig.class), um bestimmte Konfigurationsklassen hinzuzufügen, die der Slice benötigt.

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

Kurzer Test

Welche Datenbank verwendet @DataJpaTest standardmäßig?

Zusammenfassung

@WebMvcTest testet die Controller-Schicht mit MockMvc; Services werden mit @MockBean gemockt. @DataJpaTest testet Repositorys mit TestEntityManager und führt automatisch ein Rollback durch. Verwenden Sie Replace.NONE für eine echte Datenbank. Verwenden Sie @JsonTest für Serialisierung und @RestClientTest für HTTP-Clients.

Häufig gestellte Fragen

Ist die Lektion „Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest“ kostenlos?

Ja — der vollständige Text von „Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest“ 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 „Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest“?

Verwenden Sie @WebMvcTest, um Controller isoliert zu testen, und @DataJpaTest für Tests der Repository-Schicht. 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 3 von 4.

Wie lange dauert die Lektion „Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest“?

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

  1. Parametrisierte Tests mit @CsvSource und @MethodSource
  2. Mockito für Fortgeschrittene: Argument-Captoren und Spies
  3. Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest
  4. Testcontainers: Integrationstests mit echter Datenbank
← Zurück zu Java Academy