Introductie tot MockServer

1. Overzicht

MockServer is een tool voor het bespotten / stubben van externe HTTP-API's.

2. Maven afhankelijkheden

Om gebruik te maken van MockServer in onze applicatie moeten we twee afhankelijkheden toevoegen:

 org.mock-server mockserver-netty 3.10.8 org.mock-server mockserver-client-java 3.10.8 

De laatste versie van de afhankelijkheden is beschikbaar als mockserver-netty en mockserver-client.

3. MockServer Functionaliteit

Simpel gezegd, de tool kan:

  • vaste antwoorden genereren en retourneren
  • stuur een verzoek door naar een andere server
  • callbacks uitvoeren
  • verifieer een verzoek

4. Hoe te rennen MockServer

We kunnen de server op een paar verschillende manieren starten - laten we enkele van deze methoden onderzoeken.

4.1. Starten via Maven-plug-in

Hierdoor wordt de server gestart tijdens de proces-test-klasse fase en stop bij verifiëren fase:

 org.mock-server mockserver-maven-plugin 3.10.8 1080 1090 DEBUG org.mockserver.maven.Voorbeeld InitializationClass proces-test-klassen proces-test-klassen start verifiëren verifiëren stop 

4.2. Lancering via Java API

We kunnen de startClientAndServer () Java API om de server te starten. Meestal starten we een server voordat we alle tests uitvoeren:

openbare klasse TestMockServer {privé ClientAndServer mockServer; @BeforeClass openbare ongeldige startServer () {mockServer = startClientAndServer (1080); } @AfterClass openbare ongeldige stopServer () {mockServer.stop (); } // ...}

5. Onechte klanten

MockServerClient API wordt gebruikt om de mogelijkheid te bieden om verbinding te maken met het MockServer. Het modelleert verzoeken en de bijbehorende antwoorden van de server.

Het ondersteunt meerdere bewerkingen:

5.1. Verwachtingen scheppen met nepreacties

Verwachtingen zijn een mechanisme waarmee we het verzoek van een klant bespotten en het resulterende antwoord van MockServer.

Om een ​​verwachting te creëren, moeten we een verzoekovereenkomst definiëren en een antwoord dat moet worden geretourneerd.

Verzoeken kunnen worden gematcht met behulp van:

  • pad - URL-pad
  • querytekenreeks - URL-parameters
  • headers - verzoek headers
  • cookies - cookies aan de clientzijde
  • body - POST-aanvraagbody met XPATH, JSON, JSON-schema, reguliere expressie, exact overeenkomende platte tekst of body-parameters

Alle bovenstaande parameters kunnen worden opgegeven met platte tekst of reguliere expressies.

En een reactie-actie bevat:

  • statuscodes - geldige HTTP-statuscodes, bijv. 200, 400 enz.
  • body - het is de reeks bytes die inhoud bevat
  • headers - antwoordheaders met naam en een of meer waarden
  • cookies - responscookies met naam en een of meer waarden

Laten we eens kijken hoe we dat kunnen doen creëer een verwachting:

openbare klasse TestMockServer {private void createExpectationForInvalidAuth () {nieuwe MockServerClient ("127.0.0.1", 1080). wanneer (request () .withMethod ("POST") .withPath ("/ validate") .withHeader ("\" Content- typ \ ", \" application / json \ "") .withBody (exact ("{gebruikersnaam: 'foo', wachtwoord: 'bar'}")), precies (1)) .respond (antwoord () .withStatusCode ( 401) .withHeaders (nieuwe header ("Content-Type", "application / json; charset = utf-8"), nieuwe header ("Cache-Control", "public, max-age = 86400")) .withBody ( "{bericht: 'onjuiste combinatie van gebruikersnaam en wachtwoord'}") .withDelay (TimeUnit.SECONDS, 1)); } // ...}

Hier stoten we een POST verzoek aan de server. En we hebben aangegeven hoe vaak we dit verzoek moeten doen met precies (1) bellen.

Na ontvangst van dit verzoek hebben we een reactie bespot met de velden als statuscode, headers en responsbody.

5.2. Een verzoek doorsturen

Er kan een verwachting worden ingesteld om het verzoek door te sturen. Een paar parameters kunnen de voorwaartse actie beschrijven:

  • gastheer - de host om door te sturen naar b.v. www.baeldung.com
  • haven - de poort waarnaar het verzoek moet worden doorgestuurd, de standaardpoort is 80
  • regeling - protocol om b.v. HTTP of HTTPS

Laten we eens kijken naar een voorbeeld van een doorstuurverzoek:

private void createExpectationForForward () {nieuwe MockServerClient ("127.0.0.1", 1080) .when (request () .withMethod ("GET") .withPath ("/ index.html"), precies (1)) .forward (forward () .withHost ("www.mock-server.com") .withPort (80) .withScheme (HttpForward.Scheme.HTTP)); }

In dit geval hebben we een verzoek bespot dat precies op de MockServer terechtkomt en vervolgens wordt doorgestuurd naar een andere server. De buitenste vooruit() methode specificeert de voorwaartse actie en inner vooruit() method call helpt bij het construeren van de URL en stuurt het verzoek door.

5.3. Een terugbelopdracht uitvoeren

De server kan worden ingesteld om een ​​callback uit te voeren bij het ontvangen van een bepaald verzoek. Callback-actie kan callback-klasse definiëren die wordt geïmplementeerd org.mockserver.mock.action.ExpectationCallback koppel. Het zou de standaardconstructor moeten hebben en op het klassenpad moeten staan.

Laten we een voorbeeld van verwachting bekijken met een callback:

private void createExpectationForCallBack () {mockServer .when (request (). withPath ("/ callback")) .callback (callback () .withCallbackClass ("com.baeldung.mock.server.TestExpectationCallback")); }

Hier de buitenkant Bel terug() specificeert de callback-actie en de inner Bel terug() method specificeert het exemplaar van de callback method class.

In dit geval, wanneer MockServer een verzoek ontvangt met /Bel terug, dan wordt de callback-afhandelmethode die in de opgegeven klasse is geïmplementeerd, uitgevoerd:

openbare klasse TestExpectationCallback implementeert ExpectationCallback {openbare HttpResponse-handle (HttpRequest httpRequest) {if (httpRequest.getPath (). getValue (). endsWith ("/ callback")) {return httpResponse; } else {return notFoundResponse (); }} openbare statische HttpResponse httpResponse = response () .withStatusCode (200); }

5.4. Verzoeken verifiëren

MockServerClient heeft de mogelijkheid om te controleren of het te testen systeem een ​​verzoek heeft verzonden:

private void verifyPostRequest () {nieuwe MockServerClient ("localhost", 1080) .verify (request () .withMethod ("POST") .withPath ("/ validate") .withBody (exact ("{gebruikersnaam: 'foo', wachtwoord : 'bar'} ")), VerificationTimes.exactly (1)); }

Hier de org.mockserver.verify.VerificationTimes class wordt gebruikt om het aantal keren op te geven dat de mock-server moet overeenkomen met het verzoek.

6. Conclusie

In dit korte artikel hebben we verschillende functies van de MockServer onderzocht. We hebben ook gekeken naar de verschillende aangeboden API's en hoe deze kunnen worden gebruikt voor het testen van complexe systemen.

Zoals altijd is de volledige code voor dit artikel beschikbaar op GitHub.