Как заставить Wiremock выдавать ответ по умолчанию, если файл ответа шаблона не найден

#templates #wiremock

#шаблоны #wiremock

Вопрос:

В настоящее время я использую Wiremock standalone и пытаюсь имитировать службу, которая обращается к базе данных.

Мой файл сопоставления выглядит примерно так:-

 {
    "request": {
        "method": "GET",
        "urlPath": "/testService/search/details"
    },
    "response": {
        "status": 200,
        "headers": {
            "Content-Type": "application/hal json"
        },
        "transformers": ["response-template"],
        "bodyFileName": "/testTable/{{request.query.productCode}}.json" 
    }
}
 

Итак, если бы я попал по этому URL: —
http://localhost/testService/search/details ?Код продукта = 12345

Затем он отправится в базу данных get return me product 12345.

Если я отправлю службе запрос, которого нет в базе данных (например, ProductCode=0), это даст мне стандартный пустой ответ, например:-

 {
    "products": []
}
 

Поэтому я пытаюсь заставить wiremock сделать то же самое, используя конфигурацию JSON.

В данный момент, если я отправляю wiremock запрос с кодом продукта, у которого нет соответствующего файла ответа, я получаю эту ошибку:-

 Error 500 java.io.FileNotFoundException  
 

Но я хочу, чтобы он ответил пустым ответом, если он не найдет файл ответа, поэтому я хочу найти соответствующий файл ответа, если он его не найдет, а затем вернуться к файлу ответа по умолчанию, который будет содержать содержимое:-

 {
    "products": []
}
 

Я ничего не вижу в документации wiremock, которая ссылается на ответ по умолчанию для FileNotFoundExcpetion.

Ответ №1:

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

 public static class ExampleTransformer extends ResponseDefinitionTransformer {

        @Override
        public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files, Parameters parameters) {
            String productCode = request.queryParameter("productCode").toString();
            File jsonFile = new File("/path/to/json/testTable/"   productCode   ".json")
            if (jsonFile.exists()) {
                 return responseDefinition;
            } else {
                 return new ResponseDefinitionBuilder()
                    .like(responseDefinition)
                    .but()
                    .withBodyFile("/path/to/empty/product/array/file.json")
                    .build();
            }
        }

        @Override
        public String getName() {
            return "example";
        }
    }
 

Затем вам нужно будет только обновить существующий преобразователь вашего сопоставления до имени, которое вы определяете getName() , и добавить пустой файл product JSON. Преобразователь либо вернет существующий определенный ответ с соответствующим файлом JSON кода продукта, либо, если файл не существует, он вернет указанный пустой файл JSON продукта.

(Я не проверял наверняка, что код Java будет скомпилирован / запущен, но этого должно быть более чем достаточно, чтобы вы отправились в путь :))

Комментарии:

1. Будет ли это работать? Запускается мое исходное сопоставление, поскольку запрос соответствует сопоставлению, у меня просто нет соответствующего файла шаблона. Я не думаю, что wiremock будет выполнять последующие сопоставления после запуска первого? Я рад, что меня исправили!

2. Я не думаю, что следую. Если вы выполните один и тот же запрос дважды, вы получите один и тот же ответ дважды. Это сработало бы, если бы у вас было сопоставление для /test , но его не было /test2 . Вызов to /test получит ответ, указанный в файле сопоставления, а вызов to /test2 получит ответ, указанный в этом общем.

3. Я отредактировал свой вопрос, чтобы, надеюсь, сделать его более понятным. Запрос останется прежним, отличаются только параметры. Если файла ответов там нет, используйте ответ по умолчанию. Часть запроса моего сопоставления будет соответствовать запросу во всех сценариях, независимо от того, есть файл ответа или нет.

4. Ах! Теперь я понял ваш вопрос — я скоро обновлю свой ответ новым решением.

5. Обновлено! Дайте мне знать, если я не ответил на ваш вопрос: D