问题描述
我目前正在独立运行 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
如果我向服务发送数据库中不存在的请求(例如 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 代码是否可以编译/运行,但这应该足以让您继续前进 :) )