Einführung in MockServer
1. Überblick
MockServer ist ein Tool zum Verspotten / Stubben externer HTTP-APIs.
2. Maven-Abhängigkeiten
UmMockServer in unserer Anwendung verwenden zu können, müssen zwei Abhängigkeiten hinzugefügt werden:
org.mock-server
mockserver-netty
3.10.8
org.mock-server
mockserver-client-java
3.10.8
Die neueste Version der Abhängigkeiten ist alsmockserver-netty undmockserver-client. verfügbar
3. MockServer Funktionalität
Einfach ausgedrückt kann das Tool:
-
Feste Antworten generieren und zurückgeben
-
eine Anfrage an einen anderen Server weiterleiten
-
Rückrufe ausführen
-
Überprüfen Sie eine Anfrage
4. So führen SieMockServer aus
Wir können den Server auf verschiedene Arten starten. Lassen Sie uns einige dieser Methoden untersuchen.
4.1. Starten über das Maven Plugin
Dadurch wird der Server während derprocess-test-class-Phase gestartet und beiverify-Phase gestoppt:
org.mock-server
mockserver-maven-plugin
3.10.8
1080
1090
DEBUG
org.mockserver.maven.ExampleInitializationClass
process-test-classes
process-test-classes
start
verify
verify
stop
4.2. Starten über Java API
Wir können die Java-API vonstartClientAndServer()verwenden, um den Server zu starten. In der Regel wird ein Server gestartet, bevor alle Tests ausgeführt werden:
public class TestMockServer {
private ClientAndServer mockServer;
@BeforeClass
public void startServer() {
mockServer = startClientAndServer(1080);
}
@AfterClass
public void stopServer() {
mockServer.stop();
}
// ...
}
5. Mock Clients
Die API vonMockServerClientwird verwendet, um eine Verbindung zuMockServer. herzustellen. Sie modelliert Anforderungen und die entsprechenden Antworten vom Server.
Es unterstützt mehrere Operationen:
5.1. Erwartungen mit Scheinantworten erstellen
Erwartungen sind ein Mechanismus, mit dem wir die Anfrage von einem Client und die daraus resultierende Antwort von MockServer verspotten.
Um eine Erwartung zu erstellen, müssen Sie einen Anforderungsvergleicher und eine Antwort definieren, die zurückgegeben werden soll.
Anfragen können abgeglichen werden mit:
-
Pfad - URL-Pfad
-
Abfragezeichenfolge - URL-Parameter
-
Header - Header anfordern
-
cookies - clientseitige cookies
-
body - POST-Anforderungshauptteil mit XPATH-, JSON-, JSON-Schema, regulärem Ausdruck, genau übereinstimmendem Klartext oder Hauptteilparametern
Alle oben genannten Parameter können mit normalem Text oder regulären Ausdrücken angegeben werden.
Und eine Antwortaktion enthält:
-
Statuscodes - gültige HTTP-Statuscodes, z. 200, 400 usw.
-
body - das ist die Folge von Bytes, die irgendeinen Inhalt enthalten
-
Header - Antwortheader mit Namen und einem oder mehreren Werten
-
cookies - Antwortcookies mit Namen und einem oder mehreren Werten
Mal sehen, wie wircreate an expectation können:
public class TestMockServer {
private void createExpectationForInvalidAuth() {
new MockServerClient("127.0.0.1", 1080)
.when(
request()
.withMethod("POST")
.withPath("/validate")
.withHeader("\"Content-type\", \"application/json\"")
.withBody(exact("{username: 'foo', password: 'bar'}")),
exactly(1))
.respond(
response()
.withStatusCode(401)
.withHeaders(
new Header("Content-Type", "application/json; charset=utf-8"),
new Header("Cache-Control", "public, max-age=86400"))
.withBody("{ message: 'incorrect username and password combination' }")
.withDelay(TimeUnit.SECONDS,1)
);
}
// ...
}
Hier stubben wir einePOST-Anforderung an den Server. Und wir haben angegeben, wie oft wir diese Anfrage mit dem Aufruf vonexactly(1)tellen müssen.
Nach Erhalt dieser Anfrage haben wir eine Antwort mit den Feldern wie Statuscode, Überschriften und Antworttext verspottet.
5.2. Anfrage weiterleiten
Es kann eine Erwartungshaltung eingerichtet werden, um die Anfrage weiterzuleiten. Einige Parameter können die Vorwärtsbewegung beschreiben:
-
host - der Host, an den z. www.example.com
-
port - Der Port, an den die Anforderung weitergeleitet werden soll. Der Standardport ist 80
-
scheme - Protokoll zur Verwendung von z.B. HTTP oder HTTPS
Sehen wir uns ein Beispiel für eine Weiterleitungsanforderung an:
private void createExpectationForForward(){
new MockServerClient("127.0.0.1", 1080)
.when(
request()
.withMethod("GET")
.withPath("/index.html"),
exactly(1))
.forward(
forward()
.withHost("www.mock-server.com")
.withPort(80)
.withScheme(HttpForward.Scheme.HTTP)
);
}
In diesem Fall haben wir eine Anfrage verspottet, die den MockServer genau trifft und dann an einen anderen Server weitergeleitet. Die äußereforward()-Methode gibt die Weiterleitungsaktion an, und der innereforward()-Methodenaufruf hilft beim Erstellen der URL und leitet die Anforderung weiter.
5.3. Rückruf ausführen
Die RückrufaktionThe server can be set to execute a callback when receiving a particular request.kann eine Rückrufklasse definieren, die die Schnittstelle vonorg.mockserver.mock.action.ExpectationCallbackimplementiert. Es sollte den Standardkonstruktor haben und sich im Klassenpfad befinden.
Sehen wir uns ein Beispiel für die Erwartung mit einem Rückruf an:
private void createExpectationForCallBack() {
mockServer
.when(
request().withPath("/callback"))
.callback(
callback()
.withCallbackClass("com.example.mock.server.TestExpectationCallback")
);
}
Hier gibt das äußerecallback() die Rückrufaktion an und die innerecallback()-Methode gibt die Instanz der Rückrufmethodenklasse an.
In diesem Fall wird, wenn MockServer eine Anforderung mit/callback, empfängt, die in der angegebenen Klasse implementierte Callback-Handle-Methode ausgeführt:
public class TestExpectationCallback implements ExpectationCallback {
public HttpResponse handle(HttpRequest httpRequest) {
if (httpRequest.getPath().getValue().endsWith("/callback")) {
return httpResponse;
} else {
return notFoundResponse();
}
}
public static HttpResponse httpResponse = response()
.withStatusCode(200);
}
5.4. Anfragen überprüfen
MockServerClient kann überprüfen, ob das zu testende System eine Anforderung gesendet hat:
private void verifyPostRequest() {
new MockServerClient("localhost", 1080).verify(
request()
.withMethod("POST")
.withPath("/validate")
.withBody(exact("{username: 'foo', password: 'bar'}")),
VerificationTimes.exactly(1)
);
}
Hier wird die Klasseorg.mockserver.verify.VerificationTimesverwendet, um anzugeben, wie oft der Mock Server mit der Anforderung übereinstimmen soll.
6. Fazit
In diesem kurzen Artikel haben wir verschiedene Funktionen des MockServers untersucht. Wir haben auch die verschiedenen APIs untersucht, die bereitgestellt werden, und wie sie zum Testen komplexer Systeme verwendet werden können.
Wie immer ist der vollständige Code für diesen Artikel inover on GitHub. verfügbar