Введение в MockServer
1. обзор
MockServer - инструмент для имитации внешних HTTP API.
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
Это запустит сервер на этапеprocess-test-class и остановится на этапеverify:
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 APIstartClientAndServer() для запуска сервера. Обычно мы запускаем сервер перед запуском всех тестов:
public class TestMockServer {
private ClientAndServer mockServer;
@BeforeClass
public void startServer() {
mockServer = startClientAndServer(1080);
}
@AfterClass
public void stopServer() {
mockServer.stop();
}
// ...
}
5. Поддельные клиенты
APIMockServerClient используется для обеспечения возможности подключения кMockServer.. Он моделирует запросы и соответствующие ответы от сервера.
Поддерживает несколько операций:
5.1. Создание ожиданий с помощью фиктивных ответов
Ожидания - это механизм, с помощью которого мы высмеиваем запрос от клиента и полученный ответ от MockServer.
Чтобы создать ожидание, нам нужно определить совпадение запроса и ответ, который должен быть возвращен.
Запросы могут быть сопоставлены с помощью:
-
путь - путь URL
-
строка запроса - параметры URL
-
заголовки - заголовки запроса
-
куки - куки на стороне клиента
-
тело - тело запроса POST со схемой XPATH, JSON, JSON, регулярным выражением, точным соответствием параметров простого текста или тела
Все вышеперечисленные параметры могут быть указаны с использованием простого текста или регулярных выражений.
А ответное действие будет содержать:
-
коды состояния - действительные коды состояния HTTP, например 200, 400 и т. Д.
-
Тело - это последовательность байтов, содержащих любой контент
-
заголовки - заголовки ответа с именем и одним или несколькими значениями
-
куки - ответные куки с именем и одним или несколькими значениями
Давайте посмотрим, как мы можемcreate an expectation:
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 к серверу. И мы указали, сколько раз нам нужно сделать этот запрос, используя вызовexactly(1).
Получив этот запрос, мы смоделировали ответ с полями, такими как код состояния, заголовки и тело ответа.
5.2. Отправка запроса
Ожидание может быть настроено для пересылки запроса. Несколько параметров могут описать прямое действие:
-
host - хост для пересылки, например. www.example.com
-
port - порт, на который будет перенаправлен запрос, по умолчанию 80
-
scheme - протокол для использования, например 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. Выполнение обратного вызова
Действие обратного вызоваThe server can be set to execute a callback when receiving a particular request. может определять класс обратного вызова, который реализует интерфейсorg.mockserver.mock.action.ExpectationCallback. Он должен иметь конструктор по умолчанию и должен находиться в пути к классам.
Давайте посмотрим на пример ожидания с обратным вызовом:
private void createExpectationForCallBack() {
mockServer
.when(
request().withPath("/callback"))
.callback(
callback()
.withCallbackClass("com.example.mock.server.TestExpectationCallback")
);
}
Здесь внешнийcallback() определяет действие обратного вызова, а внутренний методcallback() указывает экземпляр класса метода обратного вызова.
В этом случае, когда MockServer получит запрос с/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 и способы его использования для тестирования сложных систем.
Как всегда, доступен полный код этой статьиover on GitHub.