Uvod u MockServer

1. Pregled

MockServer je alat za ismijavanje / zaustavljanje vanjskih HTTP API-ja.

2. Ovisnosti Mavena

Iskoristiti MockServer u našu aplikaciju moramo dodati dvije ovisnosti:

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

Najnovija verzija ovisnosti dostupna je kao mockserver-netty i mockserver-client.

3. MockServer Funkcionalnost

Jednostavno rečeno, alat može:

  • generirati i vratiti fiksne odgovore
  • proslijediti zahtjev drugom poslužitelju
  • izvršiti povratne pozive
  • provjeriti zahtjev

4. Kako trčati MockServer

Poslužitelj možemo pokrenuti na nekoliko različitih načina - istražimo neke od ovih metoda.

4.1. Pokretanje putem dodatka Maven

Ovo će pokrenuti poslužitelj tijekom proces-test-klasa faza i zaustaviti se na provjeriti faza:

 org.mock-server mockserver-maven-plugin 3.10.8 1080 1090 DEBUG org.mockserver.maven.ExampleInitializationClass proces-test-klase proces-test-klase start provjeriti provjeriti zaustaviti 

4.2. Pokretanje putem Java API-ja

Možemo koristiti startClientAndServer () Java API za pokretanje poslužitelja. Tipično bismo pokrenuli poslužitelj prije pokretanja svih testova:

javna klasa TestMockServer {private ClientAndServer mockServer; @BeforeClass javna void startServer () {mockServer = startClientAndServer (1080); } @AfterClass javna void stopServer () {mockServer.stop (); } // ...}

5. Ismijavanje klijenata

MockServerClient API se koristi za pružanje mogućnosti povezivanja na MockServer. Modelira zahtjeve i odgovarajuće odgovore poslužitelja.

Podržava više operacija:

5.1. Stvaranje očekivanja s lažnim odgovorima

Očekivanja su mehanizam kojim se rugamo zahtjevu klijenta i rezultirajućem odgovoru MockServera.

Da bismo stvorili očekivanje, moramo definirati podudaranje zahtjeva i odgovor koji treba vratiti.

Zahtjevi se mogu podudarati pomoću:

  • path - URL put
  • niz upita - parametri URL-a
  • zaglavlja - zaglavlja zahtjeva
  • cookies - kolačići na strani klijenta
  • body - tijelo POST zahtjeva sa XPATH, JSON, JSON shemom, regularnim izrazom, točnim podudaranjem običnog teksta ili parametara tijela

Svi gore navedeni parametri mogu se navesti pomoću običnog teksta ili regularnih izraza.

A akcija odgovora sadržavat će:

  • statusni kodovi - važeći HTTP statusni kodovi npr. 200, 400 itd.
  • tijelo - to je slijed bajtova koji sadrže bilo koji sadržaj
  • zaglavlja - zaglavlja odgovora s imenom i jednom ili više vrijednosti
  • kolačići - odgovorni kolačići s imenom i jednom ili više vrijednosti

Da vidimo kako možemo stvoriti očekivanje:

javna klasa TestMockServer {private void createExpectationForInvalidAuth () {new MockServerClient ("127.0.0.1", 1080) .when (request () .withMethod ("POST") .withPath ("/ validate") .withHeader ("\" Content- upišite \ ", \" application / json \ "") .withBody (točno ("{korisničko ime: 'foo', lozinka: 'bar'}")), točno (1)) .response (response () .withStatusCode ( 401) .withHeaders (novo zaglavlje ("Content-Type", "application / json; charset = utf-8"), novo zaglavlje ("Cache-Control", "public, max-age = 86400")) .withBody ( "{poruka: 'netočna kombinacija korisničkog imena i lozinke'}") .withDelay (TimeUnit.SECONDS, 1)); } // ...}

Evo, zapinjemo a OBJAVI zahtjev poslužitelju. I mi smo to odredili koliko puta trebamo podnijeti ovaj zahtjev pomoću točno (1) poziv.

Po primanju ovog zahtjeva ismijavali smo odgovor s poljima poput statusnog koda, zaglavlja i tijela odgovora.

5.2. Prosljeđivanje zahtjeva

Može se postaviti očekivanje za prosljeđivanje zahtjeva. Nekoliko parametara može opisati radnju naprijed:

  • domaćin - domaćin proslijediti na pr. www.baeldung.com
  • luka - luka na koju se zahtjev prosljeđuje, zadani port je 80
  • shema - protokol za korištenje na pr. HTTP ili HTTPS

Pogledajmo primjer zahtjeva za prosljeđivanje:

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

U ovom smo slučaju ismijali zahtjev koji će pogoditi MockServer točno one, a zatim proslijediti na drugi poslužitelj. Vanjski naprijed() metoda određuje akciju naprijed i unutarnju naprijed() poziv metode pomaže u konstrukciji URL-a i prosljeđuje zahtjev.

5.3. Izvršavanje povratnog poziva

Poslužitelj se može postaviti da izvršava povratni poziv prilikom primanja određenog zahtjeva. Akcija povratnog poziva može definirati klasu povratnog poziva koja se implementira org.mockserver.mock.action.ExpectationCallback sučelje. Trebao bi imati zadani konstruktor i trebao bi biti na stazi razreda.

Pogledajmo primjer očekivanja s povratnim pozivom:

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

Ovdje vanjski uzvratiti poziv() određuje radnju povratnog poziva i unutarnju uzvratiti poziv() metoda navodi instancu klase metode povratnog poziva.

U ovom slučaju, kada MockServer primi zahtjev s /uzvratiti poziv, tada će se izvršiti metoda ručke povratnog poziva implementirana u navedenoj klasi:

javna klasa TestExpectationCallback implementira ExpectationCallback {javna HttpResponse ručka (HttpRequest httpRequest) {if (httpRequest.getPath (). getValue (). ENDWith ("/ callback")) {return httpResponse; } else {vratiti notFoundResponse (); }} javni statični HttpResponse httpResponse = response () .withStatusCode (200); }

5.4. Provjera zahtjeva

MockServerClient ima mogućnost provjere je li testirani sustav poslao zahtjev:

private void verifyPostRequest () {new MockServerClient ("localhost", 1080) .verify (request () .withMethod ("POST") .withPath ("/ validate") .withBody (točno ("{korisničko ime: 'foo', lozinka : 'bar'} ")), VerificationTimes.tačno (1)); }

Evo, org.mockserver.verify.VerificationTimes klasa koristi se za određivanje broja puta kada bi Mock Server trebao odgovarati zahtjevu.

6. Zaključak

U ovom kratkom članku istražili smo različite funkcije MockServera. Također smo istražili različite API-je koji se nude i kako se mogu koristiti za testiranje složenih sustava.

Kao i uvijek, cjeloviti kôd za ovaj članak dostupan je na GitHubu.