Въведение в MockServer

1. Общ преглед

MockServer е инструмент за подиграване / заглушаване на външни API на HTTP.

2. Зависимости на Maven

За да използваме MockServer в нашето приложение, трябва да добавим две зависимости:

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

Най-новата версия на зависимостите се предлага като mockserver-netty и mockserver-client.

3. Функционалност на MockServer

Просто казано, инструментът може:

  • генериране и връщане на фиксирани отговори
  • препратете заявка до друг сървър
  • изпълнява обратно извикване
  • проверете заявка

4. Как да стартирам MockServer

Можем да стартираме сървъра по няколко различни начина - нека разгледаме някои от тези методи.

4.1. Стартиране чрез приставката Maven

Това ще стартира сървъра по време на фаза процес-тест-клас и ще спре във фаза проверка :

 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. Стартиране чрез Java API

Можем да използваме Java API startClientAndServer () Java, за да стартираме сървъра. Обикновено бихме стартирали сървър, преди да стартираме всички тестове:

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

5. Подигравка на клиенти

API на MockServerClient се използва за предоставяне на възможност за свързване с MockServer. Той моделира заявки и съответните отговори от сървъра.

Той поддържа множество операции:

5.1. Създаване на очаквания с притворни отговори

Очакванията са механизъм, чрез който се подиграваме на заявката от клиент и получения резултат от MockServer.

За да създадем очакване, трябва да дефинираме съвпадение на заявките и отговор, който трябва да бъде върнат.

Заявките могат да бъдат съпоставени с помощта на:

  • path - URL път
  • низ за заявка - параметри на URL
  • заглавки - заглавки за заявки
  • cookies - бисквитки от страна на клиента
  • body - тяло на POST заявка със схема XPATH, JSON, JSON, регулярен израз, точно съвпадение на обикновен текст или параметри на тялото

Всички горепосочени параметри могат да бъдат посочени с помощта на обикновен текст или регулярни изрази.

И действието за отговор ще съдържа:

  • кодове на състоянието - валидни кодове на HTTP състоянието, напр. 200, 400 и т.н.
  • body - това е последователността на байтовете, съдържаща каквото и да е съдържание
  • заглавки - заглавки на отговори с име и една или повече стойности
  • бисквитки - бисквитки за отговор с име и една или повече стойности

Нека да видим как можем да създадем очакване :

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) ); } // ... }

Тук забиваме POST заявка към сървъра. И ние уточнихме колко пъти трябва да направим тази заявка, използвайки точно (1) повикване.

При получаването на тази заявка се подиграхме на отговор с полетата като код на състоянието, заглавки и тяло на отговора.

5.2. Препращане на заявка

Може да се настрои очакване за препращане на заявката. Няколко параметъра могат да опишат действието напред:

  • host - домакинът, който да препрати например на www.baeldung.com
  • порт - портът, където искането да бъде препратено, портът по подразбиране е 80
  • схема - протокол за използване, например HTTP или HTTPS

Нека да видим пример за препращане на заявка:

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) ); }

В този случай сме се подиграли на заявка, която ще удари MockServer точно такива и след това ще бъде препратена към друг сървър. Външният метод forward () указва препращащото действие, а вътрешното извикване на метод forward () помага за изграждането на URL адреса и препраща заявката.

5.3. Изпълнение на обратно повикване

Сървърът може да бъде настроен да изпълнява обратно повикване при получаване на определена заявка. Действието за обратно извикване може да дефинира клас за обратно извикване, който реализира org.mockserver.mock.action.ExpectationCallback интерфейс. Той трябва да има конструктора по подразбиране и трябва да бъде в пътя на класа.

Нека да видим пример за очакване с обратно повикване:

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

Тук външното обратно извикване () указва действието за обратно извикване, а вътрешният метод за обратно извикване () определя екземпляра на класа на метода за обратно извикване.

В този случай, когато MockServer получи заявка с / callback, тогава ще се изпълни методът за обработка на callback, реализиран в посочения клас:

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. Проверка на заявки

MockServerClient има възможност да провери дали тестваната система е изпратила заявка:

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

Тук класът org.mockserver.verify.VerificationTimes се използва, за да се посочи колко пъти Mock Server трябва да съответства на заявката.

6. Заключение

В тази бърза статия разгледахме различни функции на MockServer. Също така проучихме различните предоставени API и как може да се използва за тестване на сложни системи.

Както винаги, пълният код за тази статия е достъпен в GitHub.