Introduktion til MockServer

1. Oversigt

MockServer er et værktøj til mocking / stubbing af eksterne HTTP API'er.

2. Maven-afhængigheder

At gøre brug af MockServer i vores ansøgning skal vi tilføje to afhængigheder:

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

Den seneste version af afhængighederne er tilgængelig som mockserver-netty og mockserver-client.

3. MockServer Funktionalitet

Kort sagt kan værktøjet:

  • generere og returnere faste svar
  • videresend en anmodning til en anden server
  • udføre tilbagekald
  • bekræfte en anmodning

4. Sådan kører du MockServer

Vi kan starte serveren på et par forskellige måder - lad os udforske nogle af disse metoder.

4.1. Lancering via Maven Plugin

Dette starter serveren under proces-test-klasse fase og stop ved verificere fase:

 org.mock-server mockserver-maven-plugin 3.10.8 1080 1090 DEBUG org.mockserver.maven.ExampleInitializationClass proces-test-klasser proces-test-klasser start verificer stop 

4.2. Lancering via Java API

Vi kan bruge startClientAndServer () Java API til at starte serveren. Vi starter typisk en server, inden vi kører alle tests:

offentlig klasse TestMockServer {privat ClientAndServer mockServer; @BeforeClass offentlig ugyldig startServer () {mockServer = startClientAndServer (1080); } @AfterClass offentlig ugyldig stopServer () {mockServer.stop (); } // ...}

5. Mock klienter

MockServerClient API bruges til at give mulighed for at oprette forbindelse til MockServer. Det modellerer anmodninger og de tilsvarende svar fra serveren.

Det understøtter flere operationer:

5.1. Oprettelse af forventninger med hånlige svar

Forventninger er en mekanisme, hvorved vi håner anmodningen fra en klient og det resulterende svar fra MockServer.

For at skabe en forventning er vi nødt til at definere en anmodningsmatcher og et svar, der skal returneres.

Anmodninger kan matches ved hjælp af:

  • sti - URL sti
  • forespørgselsstreng - URL-parametre
  • headers - anmod om headers
  • cookies - cookies på klientsiden
  • body - POST-anmodningstekst med XPATH-, JSON-, JSON-skema, regulært udtryk, nøjagtig matchende almindelig tekst eller brødtekstparametre

Alle ovenstående parametre kan specificeres ved hjælp af almindelig tekst eller regulære udtryk.

Og en reaktionshandling vil indeholde:

  • statuskoder - gyldige HTTP-statuskoder f.eks. 200, 400 osv.
  • body - det er sekvensen af ​​bytes, der indeholder ethvert indhold
  • overskrifter - svaroverskrifter med navn og en eller flere værdier
  • cookies - responscookies med navn og en eller flere værdier

Lad os se, hvordan vi kan skabe en forventning:

offentlig klasse TestMockServer {private void createExpectationForInvalidAuth () {new MockServerClient ("127.0.0.1", 1080) .when (anmodning () .withMethod ("POST") .withPath ("/ validate") .withHeader ("\" Content- skriv \ ", \" application / json \ "") .withBody (nøjagtig ("{brugernavn: 'foo', adgangskode: 'bar'}")), nøjagtigt (1)). svar (svar () .withStatusCode ( 401) .withHeaders (ny header ("Content-Type", "application / json; charset = utf-8"), ny header ("Cache-Control", "public, max-age = 86400")) .withBody ( "{meddelelse: 'forkert kombination af brugernavn og adgangskode'}") .withDelay (TimeUnit.SECONDS, 1)); } // ...}

Her stubber vi en STOLPE anmodning til serveren. Og vi har specificeret, hvor mange gange vi har brug for at stille denne anmodning nøjagtigt (1) opkald.

Efter at have modtaget denne anmodning har vi spottet et svar med felterne som statuskode, overskrifter og svarorgan.

5.2. Videresendelse af en anmodning

Forventning kan indstilles til at videresende anmodningen. Et par parametre kan beskrive den fremadrettede handling:

  • vært - værten til at videresende til f.eks. www.baeldung.com
  • Havn - den port, hvor anmodningen om at blive videresendt, standardporten er 80
  • ordning - protokol til brug f.eks. HTTP eller HTTPS

Lad os se et eksempel på videresendelsesanmodning:

privat tomrum createExpectationForForward () {new MockServerClient ("127.0.0.1", 1080). når (anmodning () .withMethod ("GET") .withPath ("/ index.html"), nøjagtigt (1)). fremad (fremad () .withHost ("www.mock-server.com") .withPort (80) .withScheme (HttpForward.Scheme.HTTP)); }

I dette tilfælde har vi spottet en anmodning, der vil ramme MockServer nøjagtigt dem og derefter videresendt til en anden server. Det ydre frem() metode specificerer den fremadrettede handling og indre frem() metodeopkald hjælper med at konstruere URL'en og videresender anmodningen.

5.3. Udførelse af en tilbagekaldelse

Serveren kan indstilles til at udføre et tilbagekald, når der modtages en bestemt anmodning. Callback-handling kan definere callback-klasse, der implementeres org.mockserver.mock.action.ExpectationCallback interface. Den skal have standardkonstruktøren og skal være på klassestien.

Lad os se et eksempel på forventning med tilbagekald:

privat ugyldigt createExpectationForCallBack () {mockServer .when (anmodning (). withPath ("/ callback")). callback (callback () .withCallbackClass ("com.baeldung.mock.server.TestExpectationCallback")); }

Her det ydre ring tilbage() angiver tilbagekaldshandlingen og den indre ring tilbage() metode angiver forekomsten af ​​tilbagekaldsmetodeklassen.

I dette tilfælde, når MockServer modtager en anmodning med /ring tilbage, derefter udføres tilbagekaldningshåndteringsmetoden implementeret i den angivne klasse:

offentlig klasse TestExpectationCallback implementerer ExpectationCallback {public HttpResponse handle (HttpRequest httpRequest) {if (httpRequest.getPath (). getValue (). endsWith ("/ callback")) {return httpResponse; } andet {returnere ikkeFoundResponse (); }} offentlig statisk HttpResponse httpResponse = respons () .withStatusCode (200); }

5.4. Bekræftelse af anmodninger

MockServerClient har mulighed for at kontrollere, om systemet under test sendte en anmodning:

privat ugyldighed verificerePostRequest () {ny MockServerClient ("localhost", 1080). verificere (anmodning () .withMethod ("POST") .withPath ("/ validere") .withBody (eksakt ("{brugernavn: 'foo', adgangskode) : 'bar'} ")), VerificationTimes. nøjagtigt (1)); }

Her, den org.mockserver.verify.VerificationTimes klasse bruges til at angive antallet af gange, Mock Server skal matche anmodningen.

6. Konklusion

I denne hurtige artikel har vi udforsket forskellige funktioner i MockServer. Vi har også undersøgt de forskellige leverede API'er, og hvordan det kan bruges til test af komplekse systemer.

Som altid er den komplette kode til denne artikel tilgængelig på GitHub.