Начало работы с WireMock

задняя часть

Введение

В последнее время проект компании нуждается в рефакторинге, и принят режим разделения фронтенда и бэкенда. Из-за разницы в эффективности разработки и прогрессе между фронтенд- и бэкенд-разработчиками, фронтенд-разработчикам необходимо подделывать данные при написании кода вызывающего интерфейса. Это означает, что N фронтенд-персоналу необходимо поддерживать N копий данных, и у каждого фронтенд-персонала может быть разное понимание бизнеса, а поддельные данные необъективны, поэтому будут проблемы, когда интерфейс фактически отлаживается с помощью задняя часть.

Чтобы решить эту проблему, мы можем использовать WireMock.

2. Введение

2.1 Краткое введение

WireMock — это эмулятор на основе HTTP. Он включает заглушку ответов HTTP, проверку запросов, проксирование / перехват, запись и воспроизведение.

Когда прогресс разработки разработчиков непостоянен, они могут полагаться на интерфейс, созданный WireMock, для имитации различных запросов и ответов, чтобы избежать прогресса разработки определенного модуля.

2.2 Скачать файлы

нажмитеWire mock.org/docs/run you…Загрузите пакет jar, который запускает службу WireMock.

2.3 Запустите службу

Выполните следующую команду в каталоге, где находится пакет jar:

java -jar wiremock-standalone-2.13.0.jar --port 9999

После запуска, как показано ниже:

image

Дополнительные параметры см. в официальной документации.

3. Напишите ответ

После того, как сервис WireMock запущен, это все еще просто пустая оболочка, нам нужно добавить правила запросов и запросы ответов к сервису.

Создайте проект maven и напишите клиентский код WireMock.

3.1 Добавить зависимости

<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock</artifactId>
    <version>2.13.0</version>
</dependency>

3.2 Написание ответа

import static com.github.tomakehurst.wiremock.client.WireMock.*;
public class App {
    
    public static void main(String[] args) {
        // 连接 9999 端口
        configureFor(9999);
        // 删除旧的规则
        removeAllMappings();
        
        stubFor(get(urlPathEqualTo("/user/1"))
                .willReturn(aResponse()
                .withStatus(200)
                .withBody("{\"id\":1,\"name\":\"Jack\"}")));
        
    }
}

Пополнить:

получить(): получить запрос

withStatus: вернуть статус

withBody: вернуть данные

После выполнения метода наш имитированный запрос и ответ добавляются в сервис WireMock.

Открытый доступ в браузереhttp://127.0.0.1:9999/user/1, эффект следующий:

image

4. Оптимизация

В реальном бизнес-коде невозможно вызвать интерфейс и вернуть простую строку JSON. Запись этих строк в приведенный выше код была бы катастрофой, когда нам нужно изменить структуру данных, поэтому мы можем записать возвращенные данные в файл для обслуживания.

4.1 Новый файл

Создайте файл user.txt (пользовательский) в каталоге проекта src/main/resources со следующим содержимым:

{
    "id":1,
    "name":"jack",
    "age":18,
    "birthday":"2018-01-01"
}

4.2 Добавить зависимости

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

API вышеуказанных зависимостей нужно использовать в тестовом коде, если ридер настроил API для чтения файлов, этот шаг можно пропустить.

4.3 Изменить код

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.springframework.core.io.ClassPathResource;
public class App {
    
    public static void main(String[] args) throws IOException {
        // 连接 9999 端口
        configureFor(9999);
        // 删除旧的规则
        removeAllMappings();
        // 添加请求规则和请求响应
        mock("user.txt","/user/1");
        
    }
    
    private static void mock(String fileName, String url) throws IOException{
        // 加载文件
        ClassPathResource resource = new ClassPathResource(fileName);
        // 读取内容
        String data = FileUtils.readFileToString(resource.getFile(), "UTF-8");
        
        stubFor(get(urlPathEqualTo(url))
                .willReturn(aResponse()
                    .withStatus(200)
                    .withBody(data)));
    }
}

Выполните метод, откройте браузер для доступаhttp://127.0.0.1:9999/user/1, эффект следующий:

image

Когда нам нужно смоделировать новый интерфейс для внешнего интерфейса, нам просто нужно запустить фиктивный метод с другими параметрами.

Примечание. Описанный выше фиктивный метод предназначен только для имитации запроса на получение. Если вам необходимо смоделировать запрос различных методов, см. следующую информацию.

5. Ссылки