Testen in Java: Unit, Integration, E2E von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum ist Testen in Java wichtig?

\n

Jeder Java-Entwickler war schon einmal in der Situation, dass nach der Änderung einer einzigen Codezeile das gesamte System „kaputtging“. Um solche Katastrophen zu vermeiden, hat die Industrie ein durchdachtes Testsystem entwickelt. In diesem Artikel betrachten wir drei Testebenen in Java: Unit (Modultests), Integration (Integrationstests) und E2E (End-to-End-Tests). Sie erfahren, wie sie sich unterscheiden, welche Werkzeuge verwendet werden und wie man Tests in Java richtig schreibt.

\n

Unabhängig davon, ob Sie Microservices mit Spring Boot oder Desktop-Anwendungen entwickeln, das Verständnis der Testpyramide ist eine grundlegende Fähigkeit. Los geht's!

\n\n

1. Unit-Tests: Das Fundament der Qualität

\n

Unit-Tests (Modultests) prüfen die Arbeit einzelner Klassen oder Methoden isoliert von externen Abhängigkeiten. Dies ist die schnellste und günstigste Testebene.

\n\n

1.1 Wichtigste Werkzeuge

\n
    \n
  • JUnit 5 — das Standard-Framework für Java (neueste Version: Jupiter).
  • \n
  • Mockito — Bibliothek zum Erstellen von Mock-Objekten (Stubs).
  • \n
  • AssertJ — Bibliothek mit einem umfangreichen Satz an Fluent-Assertions.
  • \n
\n\n

1.2 Beispiel eines Unit-Tests mit JUnit 5 und Mockito

\n

Angenommen, wir haben einen Service UserService, der von einem Repository UserRepository abhängt:

\n
public class UserService {\n    private final UserRepository repository;\n\n    public UserService(UserRepository repository) {\n        this.repository = repository;\n    }\n\n    public String getUserName(Long id) {\n        User user = repository.findById(id);\n        return user != null ? user.getName() : "Unknown";\n    }\n}
\n

Schreiben wir einen Unit-Test, der die externe Abhängigkeit mit Mockito isoliert:

\n
import org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.InjectMocks;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\nimport static org.mockito.Mockito.when;\n\n@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n\n    @Mock\n    private UserRepository userRepository;\n\n    @InjectMocks\n    private UserService userService;\n\n    @Test\n    void testGetUserName_WhenUserExists() {\n        // Arrange\n        User mockUser = new User(1L, "Alice");\n        when(userRepository.findById(1L)).thenReturn(mockUser);\n\n        // Act\n        String result = userService.getUserName(1L);\n\n        // Assert\n        assertEquals("Alice", result);\n    }\n\n    @Test\n    void testGetUserName_WhenUserNotFound() {\n        when(userRepository.findById(99L)).thenReturn(null);\n\n        String result = userService.getUserName(99L);\n\n        assertEquals("Unknown", result);\n    }\n}
\n

Faustregel: Ein Test – eine Überprüfung. Verwenden Sie aussagekräftige Methodennamen (z. B. testGetUserName_WhenUserExists).

\n\n

2. Integrationstests: Überprüfung von Interaktionen

\n

Integrationstests prüfen, wie die Komponenten des Systems zusammenarbeiten: Datenbank, Dateisystem, externe APIs. Sie sind langsamer als Unit-Tests, geben aber mehr Sicherheit über die Korrektheit der Verbindungen.

\n\n

2.1 Werkzeuge für Integrationstests in Java

\n
    \n
  • Spring Boot Test — @SpringBootTest zum Starten des Anwendungskontexts.
  • \n
  • Testcontainers — Starten echter Datenbanken (PostgreSQL, MySQL) in Docker-Containern.
  • \n
  • H2 — In-Memory-Datenbank für schnelle Tests.
  • \n
\n\n

2.2 Beispiel eines Integrationstests mit Spring Boot und Testcontainers

\n
import org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.t                

Blogs

Buchempfehlungen