Введение в MockServer

Введение в 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.