Как в Wiremock выбирать файл с бади в зависимости от параметра запроса в урле? И возможно ли такое?

В WireMock, как и в других инструментах мокирования сервера, есть возможность выбора файла с телом ответа на основе параметров запроса в URL. Это делается с помощью использования WireMock Request Matchers и Response Definitions.

Request Matchers - это модуль WireMock, который позволяет проверять и сопоставлять параметры запроса с определенными правилами. Он используется для сопоставления и выбора мок-ответа на основе состояния запроса.

Для решения вашей задачи необходимо определить кастомный Request Matcher, который будет проверять параметры запроса в URL и сопоставлять их с нужными файлами с телами ответа. Затем, при совпадении параметров, можно вернуть соответствующий файл с телом ответа.

Вот пример использования WireMock с выбором файла с боди в зависимости от параметра запроса в URL:

1. Создайте mock-сервер в WireMock:

WireMockServer wireMockServer = new WireMockServer(options().port(8080));
wireMockServer.start();
WireMock.configureFor("localhost", wireMockServer.port());

// Загрузите файлы с телами ответа в директорию mappings
FileMappingsSource mappingsSource = new SingleRootFileMappingsSource(
    Paths.get("путь_к_директории_с_файлами_ответов").toAbsolutePath().toString()
);
wireMockServer.loadMappingsUsing(mappingsSource);

2. Определите класс, реализующий кастомный Request Matcher:

class CustomRequestMatcher extends RequestMatcherExtension {

    @Override
    public String getName() {
        return "custom-request-matcher";
    }

    @Override
    public MatchResult match(Request request, Parameters parameters) {
        List<StubMapping> stubMappings = parameters.remainderAsMappings();
        
        // Получите значение параметра запроса в URL
        String parameterValue = request.queryParameter("имя_параметра_запроса");
        
        // Проитерируйтесь по всем мок-ответам и сравните значение параметра запроса с нужным значением
        for (StubMapping mapping : stubMappings) {
            String expectedValue = mapping.getMetadata().getString("имя_пользовательского_параметра");
            if (parameterValue.equals(expectedValue)) {
                return MatchResult.of(true);
            }
        }
        
        return MatchResult.of(false);
    }
}

3. Зарегистрируйте кастомный Request Matcher и используйте его для выбора файлов с телами ответов:

WireMock.registerExtension(new CustomRequestMatcher());

WireMock.stubFor(
    get(urlEqualTo("/some-path"))
        .withExtension("custom-request-matcher")
        .willReturn(aResponse().withBodyFile("файл_с_боди_ответа.json"))
);

В данном примере мы создаем mock-ответ для GET-запроса на /some-path, который проверяет наличие параметра запроса в URL и возвращает файл с телом ответа файл_с_боди_ответа.json. Значение параметра сопоставляется с заданным значением в пользовательском параметре.

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