15 Testen in Spring Boot-Anwendungen

Spring Boot vereinfacht das Erstellen stand-alone, produktionsreife Spring-Anwendungen erheblich und bietet gleichzeitig robuste Unterstützung für Testautomatisierung und -validierung. Das Testen ist ein integraler Bestandteil des Entwicklungsprozesses in Spring Boot, wobei das Framework umfangreiche Unterstützung für Unit- und Integrationstests durch eine Kombination aus Spring Test- und JUnit-Funktionalitäten bietet.

15.1 Grundlagen des Testens in Spring Boot

Spring Boot fördert das Prinzip der Testautomatisierung durch eine nahtlose Integration mit dem Spring Test Framework und JUnit. Es bietet vordefinierte Annotationen und Auto-Konfigurationen, die das Schreiben und Ausführen von Tests vereinfachen.

15.1.1 Abhängigkeiten

Um mit dem Testen in einer Spring Boot-Anwendung zu beginnen, sollten Sie sicherstellen, dass die spring-boot-starter-test Abhängigkeit in Ihrer pom.xml oder build.gradle Datei enthalten ist. Diese Starter-Abhängigkeit umfasst Spring Test, JUnit, Hamcrest, Mockito und andere nützliche Bibliotheken.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>{spring-boot-version}</version>
    <scope>test</scope>
</dependency>

15.1.2 Wichtige Annotationen

15.2 Unit Tests in Spring Boot

Unit Tests fokussieren sich auf die kleinste Einheit des Codes, üblicherweise Methoden von Klassen. Sie sind schnell, isoliert und zeigen direkt, wo ein Problem liegen könnte.

15.2.1 Beispiel eines Service Unit Tests

@SpringBootTest
public class MyServiceTest {

    @MockBean
    private MyRepository myRepository;

    @Autowired
    private MyService myService;

    @Test
    void testMyServiceMethod() {
        // Konfigurieren der Mocks
        when(myRepository.findSomething()).thenReturn(new MyEntity());

        // Ausführen der zu testenden Service-Methode
        MyEntity result = myService.doSomething();

        // Überprüfen, ob die Methode das erwartete Ergebnis liefert
        assertNotNull(result);
    }
}

15.3 Integrationstests in Spring Boot

Integrationstests prüfen, wie verschiedene Teile der Anwendung zusammenarbeiten. In Spring Boot umfassen diese Tests oft den vollständigen Spring-Anwendungskontext oder Teile davon.

15.3.1 Beispiel eines Web Layer Integrationstests

@WebMvcTest(MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MyService myService;

    @Test
    public void testMyController() throws Exception {
        // Mock-Service-Konfiguration
        when(myService.doSomething()).thenReturn("Expected Response");

        // Ausführen einer HTTP GET-Anfrage und Überprüfen des Ergebnisses
        mockMvc.perform(get("/my-path"))
               .andExpect(status().isOk())
               .andExpect(content().string(containsString("Expected Response")));
    }
}

Dieser Test verwendet @WebMvcTest für das Testen von MVC-Controllern ohne den vollständigen ApplicationContext zu laden. MockMvc wird verwendet, um HTTP-Anfragen zu simulieren und das Ergebnis zu validieren.

15.4 Testen von Datenzugriffsschichten

Spring Boot vereinfacht das Testen von Datenzugriffsschichten, insbesondere JPA-Repositories, durch die Bereitstellung spezifischer Testannotationen und Datenbank-Konfigurationen.

15.4.1 Beispiel eines Repository-Tests

@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private MyRepository myRepository;

    @Test
    public void testFindBySomething() {
        // Vorbereitung: Speichern eines Testobjekts
        MyEntity myEntity = new MyEntity();
        entityManager.persist(myEntity);

        // Test: Suchen des Objekts über das Repository
        List<MyEntity> found = myRepository.findBy

Something(myEntity.getSomething());

        // Überprüfung: Das richtige Objekt wurde gefunden
        assertThat(found).contains(myEntity);
    }
}

@DataJpaTest lädt nur die für JPA relevanten Konfigurationen und Komponenten, was den Test fokussiert und performant macht.