WireMock für Java: Vollständige Anleitung zum HTTP-Mock-Server
1. Was ist WireMock und warum wird es benötigt?
WireMock ist eine leistungsstarke Bibliothek für Java (und andere Sprachen über den Standalone-Server), mit der Sie HTTP-Mock-Server für Tests erstellen können. Im Wesentlichen handelt es sich um einen Emulator eines echten HTTP-Dienstes (API, REST, SOAP), den Sie so konfigurieren können, dass er auf bestimmte Anfragen vordefinierte Antworten zurückgibt. Dies ist ein unverzichtbares Werkzeug im Arsenal jedes Entwicklers und Testers, der mit Microservices-Architekturen oder Systemen arbeitet, die von externen HTTP-Diensten abhängig sind.
Warum ist das notwendig? In der modernen Entwicklung existieren Anwendungen selten isoliert. Sie kommunizieren mit Datenbanken, Zahlungs-Gateways, Authentifizierungsdiensten, Wetter-APIs und Dutzenden anderer externer Systeme. Das Testen dieser Integrationen "live" ist eine Herausforderung: Der externe Dienst kann nicht verfügbar, langsam sein, unerwartete Daten zurückgeben oder, noch schlimmer, für jede Anfrage Geld verlangen. WireMock löst dieses Problem, indem es Folgendes ermöglicht:
- Isoliertes Testen: Sie testen nur Ihren Code, unabhängig von der Verfügbarkeit und Stabilität externer Dienste.
- Simulation seltener Szenarien: Sie können den Mock einfach dazu bringen, 500-Fehler, Timeouts, leere Antworten oder spezifische Header zurückzugeben – Dinge, die mit einem echten Dienst schwer zu reproduzieren sind.
- Schnellere Tests: Der Mock-Server antwortet in Millisekunden, während ein echter Dienst Sekunden benötigen kann.
- Parallelisierung der Entwicklung: Während das Backend-Team die API noch nicht implementiert hat, kann das Frontend-Team bereits seinen Code mit WireMock schreiben und testen.
WireMock fungiert als vollwertiger HTTP-Server (basierend auf Jetty), der innerhalb Ihres Tests oder als separater Prozess läuft. Er fängt HTTP-Anfragen ab, vergleicht sie mit konfigurierten Regeln (Stubs) und gibt die entsprechende Antwort zurück. Die Bibliothek unterstützt Aufzeichnung und Wiedergabe (Record/Playback), Zustandsüberprüfung (Verify), Arbeit mit Vorlagen (Handlebars), Simulation von Verzögerungen und vieles mehr.
2. Installation
WireMock für Java wird über Maven Central vertrieben. Fügen Sie die folgende Abhängigkeit zu Ihrer pom.xml (für Maven) oder build.gradle (für Gradle) hinzu.
Maven (pom.xml):
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
<version>3.9.1</version> <!-- Prüfen Sie die aktuelle Version auf Maven Central -->
<scope>test</scope>
</dependency>
Gradle (build.gradle):
testImplementation 'org.wiremock:wiremock:3.9.1'
Wichtig: Ab Version 3.x erfordert WireMock Java 11 oder höher. Wenn Sie Java 8 verwenden, müssen Sie Version 2.x (z. B. 2.35.1) nutzen, aber ein Upgrade auf Java 11+ wird dringend empfohlen.
3. Schnellstart – Minimales funktionierendes Beispiel
Erstellen wir einen einfachen Test, der WireMock startet, einen Stub für eine GET-Anfrage an /api/hello konfiguriert und überprüft, ob der Client die erwartete Antwort erhält.
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;