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/.