【问题标题】:How to get Wiremock to give a default response if template response file not found如果找不到模板响应文件,如何让 Wiremock 给出默认响应
【发布时间】:2021-04-20 10:39:58
【问题描述】:

我目前正在独立运行 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

然后它会去数据库获取return me product 12345。

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

{
    "products": []
}

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

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

Error 500 java.io.FileNotFoundException  

但是如果它没有找到响应文件,我希望它回复一个空响应,所以我想寻找一个匹配的响应文件,如果它没有找到,然后回退到默认响应文件,内容如下:-

{
    "products": []
}

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

【问题讨论】:

    标签: templates wiremock


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

    (我没有确定 Java 代码是否会编译/运行,但这应该足以让您上路了 :))

    【讨论】:

    • 这行得通吗?我的原始映射正在触发,因为请求与映射匹配,我只是没有相应的模板文件。我认为第一个映射被触发后,wiremock 不会执行后续映射?不过,我很高兴得到纠正!
    • 我不认为我跟随。如果您执行两次相同的请求,您将获得两次相同的响应。如果您有/test 的映射,但没有/test2 的映射,这将起作用。对/test 的调用将获得映射文件中指定的响应,对/test2 的调用将获得此泛型中指定的响应。
    • 我已经编辑了我的问题,希望它更容易理解。请求将保持不变,只是参数不同。如果响应文件不存在,则使用默认响应。我的映射的请求部分会匹配所有场景下的请求,不管有没有响应文件。
    • 啊!我现在收到您的问题 - 我很快就会用新的解决方案更新我的答案。
    • 更新了!让我知道我是否还没有回答您的问题:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多