如果找不到模板响应文件,如何让 Wiremock 给出默认响应

问题描述

我目前正在独立运行 wiremock,我正在尝试模拟访问数据库的服务。

我的映射文件如下所示:-

{
    "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" 
    }
}

所以如果我点击这个网址:-
http://localhost/testService/search/details?productCode=12345

然后它会去数据库获取返回给我的产品 12345。

如果我向服务发送数据库中不存在的请求(例如 productCode=0),它会给我一个标准的空响应,例如:-

{
    "products": []
}

因此,我试图让 wiremock 使用 JSON 配置来做同样的事情。

目前,如果我使用没有相应响应文件的 productCode 向 wiremock 发送请求,我会收到此错误:-

Error 500 java.io.FileNotFoundException  

但是如果没有找到响应文件,我希望它以空响应回复,所以我想寻找匹配的响应文件,如果没有找到,则回退到认响应文件,它将包含以下内容:-

{
    "products": []
}

我在 wiremock 文档中看不到任何涉及 FileNotFoundExcpetion 上的认响应的内容

解决方法

因此,我认为您需要编写一个自定义响应转换器来完成此操作。应该是这样的:

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() 中定义的名称,并添加一个空的产品 JSON 文件。转换器将使用相应的产品代码 JSON 文件返回现有定义的响应,或者如果文件不存在,它将返回指定的空产品 JSON 文件。

(我没有确定 Java 代码是否可以编译/运行,但这应该足以让您继续前进 :) )