Mockito für Java: Vollständiger Leitfaden mit Beispielen

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

Was ist Mockito und wozu wird es benötigt?

\n\n

Mockito ist eine leistungsstarke Bibliothek für Java, die zum Erstellen von Mock-Objekten (Stubs) in Modultests entwickelt wurde. Sie ermöglicht es, den zu testenden Code von seinen Abhängigkeiten wie Datenbanken, externen APIs, Dateisystemen oder anderen Diensten zu isolieren. Anstelle von realen Objekten, die langsam, instabil sein oder eine komplexe Einrichtung erfordern können, erstellen Sie deren Nachbildungen mit einem vorab festgelegten Verhalten.

\n\n

Das Hauptziel von Mockito ist es, Unit-Tests schnell, vorhersagbar und unabhängig von der externen Umgebung zu machen. Die Bibliothek wird im Java-Ökosystem (Spring, Java EE, Android) weit verbreitet eingesetzt und ist der De-facto-Standard für das Mocking.

\n\n

Wichtige Funktionen:

\n
    \n
  • Erstellung von Mock-Objekten — Nachbildung jeder Klasse oder Schnittstelle.
  • \n
  • Definition des Verhaltens — Festlegung von Rückgabewerten, Auslösen von Ausnahmen.
  • \n
  • Verifizierung von Aufrufen — Überprüfung, ob Methoden mit bestimmten Parametern und der erforderlichen Anzahl aufgerufen wurden.
  • \n
  • Spy (teilweises Mocking) — Möglichkeit, ein reales Objekt zu verwenden, aber einzelne Methoden zu überschreiben.
  • \n
  • ArgumentCaptor (Erfassen von Argumenten) — Extrahieren von Parametern, die an eine Mock-Methode übergeben wurden, zur weiteren Überprüfung.
  • \n
\n\n

Installation von Mockito

\n\n

Da Mockito eine Java-Bibliothek ist, wird sie nicht über pip oder npm installiert. Für die Einbindung in ein Projekt werden die Build-Systeme Maven oder Gradle verwendet.

\n\n

Maven (pom.xml)

\n
<dependency>\n    <groupId>org.mockito</groupId>\n    <artifactId>mockito-core</artifactId>\n    <version>5.12.0</version>\n    <scope>test</scope>\n</dependency>\n\n<!-- Für die Verwendung mit JUnit 5 -->\n<dependency>\n    <groupId>org.mockito</groupId>\n    <artifactId>mockito-junit-jupiter</artifactId>\n    <version>5.12.0</version>\n    <scope>test</scope>\n</dependency>
\n\n

Gradle (build.gradle)

\n
testImplementation 'org.mockito:mockito-core:5.12.0'\ntestImplementation 'org.mockito:mockito-junit-jupiter:5.12.0'
\n\n

Es wird empfohlen, die neueste stabile Version zu verwenden, die zum Zeitpunkt der Erstellung der Tests aktuell ist.

\n\n

Schnellstart: Codebeispiel

\n\n

Betrachten wir ein einfaches Beispiel. Angenommen, wir haben eine Klasse UserService, die von UserRepository abhängt. Wir möchten UserService testen, ohne eine Datenbank zu starten.

\n\n
// Repository-Klasse (Abhängigkeit)\npublic interface UserRepository {\n    User findById(Long id);\n    void save(User user);\n}\n\n// Service-Klasse (zu testen)\npublic class UserService {\n    private final UserRepository userRepository;\n\n    public UserService(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n\n    public String getUserName(Long id) {\n        User user = userRepository.findById(id);\n        return user != null ? user.getName() : "Unknown";\n    }\n}\n\n// Test mit Mockito\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.Mock;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\nimport static org.mockito.Mockito.*;\nimport static org.junit.jupiter.api.Assertions.*;\n\n@ExtendWith(MockitoExtension.class)\npublic class UserServiceTest {\n\n    @Mock\n    private UserRepository userRepository;\n\n    @Test\n    public void testGetUserName() {\n        // Erstellen eines Mock-Objekts für UserRepository (auch über die Annotation @Mock möglich)\n        // UserRepository mockRepo = mock(UserRepository.class);\n\n        // Verhalten festlegen: Bei Aufruf von findById(1L) einen Benutzer zurückgeben\n        User mockUser = new User(1L, "Alice");\n        when(userRepository.findById(1L)).thenReturn(mockUser);\n\n                    

Empfehlungen