Wiremock: выберите имя файла тела на основе параметра запроса

Я использую Wiremock для макета http-сервера, и я возвращаю ответы из файлов JSON (используя withBodyFile метод).

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

myMockServer.stubFor(
       get(urlEqualTo(myEndPoint+ "?key=key1"))
       .willReturn(aResponse().withStatus(200)
       .withHeader("Content-Type", "application/json")
       .withBodyFile("response_key1.json")

myMockServer.stubFor(
       get(urlEqualTo(myEndPoint+ "?key=key2"))
       .willReturn(aResponse().withStatus(200)
       .withHeader("Content-Type", "application/json")
       .withBodyFile("response_key2.json")
myMockServer.stubFor(
       get(urlEqualTo(myEndPoint+ "?key=key3"))
       .willReturn(aResponse().withStatus(200)
       .withHeader("Content-Type", "application/json")
       .withBodyFile("response_key3.json")

Есть идеи, как это возможно? Я попытался определить преобразователь, но не удалось получить путь потока источника из объекта Response в переопределенном методе, поэтому я не могу использовать это appraoch. Большое спасибо..

1 ответ

Имя файла тела не может быть параметризовано в Wiremock на данный момент. У меня было похожее требование, мне нужно было вернуть файл на основе URL запроса. Поэтому я реализовал трансформатор, как показано ниже:

public class BodyFileNameResponseTransformer extends ResponseDefinitionTransformer {


public ResponseDefinition transform(Request request, ResponseDefinition rd,
    FileSource fileSource, Parameters parameters) {

    if (rd.getBodyFileName().startsWith("{{")) {
        return new ResponseDefinitionBuilder().**withBodyFile**(request.getUrl().substring(1))
            .withStatus(rd.getStatus())
            .withHeaders(rd.getHeaders())
            .withTransformers(
                rd.getTransformers().toArray(new String[rd.getTransformers().size()]))
            .build();
    }

    return rd;
}

public String getName() {
    return "BodyFileNameTransformer";
}

}

Вы можете использовать request.queryParameter(key) вместо request.getUrl() и сформировать любой путь к файлу. Создайте путь к файлу на основе ваших потребностей и установите его как body File для возвращенного ResponseDefinition.

Не забудьте запустить wiremock с --extensions: имена классов расширений

Более подробная информация на Расширение Wiremock

Это возможно с помощью встроенных помощников шаблонов, предоставляемых Handlebar.

myMockServer.stubFor(
       get(urlEqualTo(myEndPoint+ "?key=key3"))
       .willReturn(aResponse().withStatus(200)
       .withHeader("Content-Type", "application/json")
       .withBodyFile("response_{{request.query.key}}.json")

Проверьте наличие различных моделей на http://wiremock.org/docs/response-templating/.

Другие вопросы по тегам