Wiremock:根据请求参数选择响应体文件名
根据请求参数动态返回对应JSON响应的Wiremock Stub实现
我明白你想要实现的是根据请求里的key参数,动态返回对应的JSON响应文件对吧?这在Wiremock里有两种实现方式,你可以根据需求场景灵活选择:
方式一:响应模板(推荐,适合多key场景)
这种方式不用为每个key单独编写Stub,通过Wiremock的响应模板功能动态拼接文件名,高效又简洁。
步骤1:启用响应模板功能
在创建Wiremock服务器时,需要添加响应模板扩展:
WireMockServer myMockServer = new WireMockServer( wireMockConfig().extensions(new ResponseTemplateTransformer(false)) ); myMockServer.start();
这里的false表示仅在需要的Stub中启用模板,若设为true则全局启用所有Stub的模板解析。
步骤2:编写动态匹配的Stub
String myEndPoint = "/your-api-endpoint"; // 替换成你的实际接口路径 myMockServer.stubFor(get(urlPathEqualTo(myEndPoint)) // 匹配任意key参数值,若需限定特定key可改成matching("key1|key2") .withQueryParam("key", matching(".*")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") // 通过模板语法获取请求的key参数,动态拼接响应文件名 .withBodyFile("response_{{request.query.key}}.json") // 启用当前Stub的模板转换功能 .withTransformers("response-template")));
关键说明
- 确保你的JSON响应文件(比如
response_key1.json、response_key2.json)放在Wiremock默认的文件目录src/test/resources/__files下; {{request.query.key}}是Wiremock的模板表达式,会自动提取请求URL中key参数的值;- 如果需要对key参数做更严格的校验,可以修改
matching()里的正则表达式,比如只允许数字后缀的key:matching("key\\d+")。
方式二:单独Stub匹配(适合少量key场景)
如果你的key数量不多,也可以为每个key单独编写Stub,逻辑更直观:
String myEndPoint = "/your-api-endpoint"; // 匹配key=key1的请求 myMockServer.stubFor(get(urlEqualTo(myEndPoint + "?key=key1")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBodyFile("response_key1.json"))); // 匹配key=key2的请求 myMockServer.stubFor(get(urlEqualTo(myEndPoint + "?key=key2")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBodyFile("response_key2.json")));
内容的提问来源于stack exchange,提问作者Kumar Gaurav
相关产品推荐
相关产品推荐

