如何配置WireMock POST Stub:匹配请求体并返回自定义响应文件
WireMock POST Stub 配置方案(对应你的需求)
先明确withBodyFile的作用
withBodyFile是配置响应体的方法,只能放在willReturn(aResponse())代码块下,用来指定返回的响应内容对应的文件路径(文件必须放在WireMock默认的__files目录下,一般是src/test/resources/__files)。你之前代码里写的"Hello /world!"是错误用法,应该填类似response.json的文件名。
实现「请求用JSON文件匹配 + 响应返回另一个JSON文件」
要匹配带创建ID的请求体,需要在stubFor(post(...))后面添加.withRequestBody()配置,从文件读取请求体内容来做匹配。具体步骤:
- 把请求体模板(比如包含
createId字段的request.json)和响应模板response.json放到WireMock的__files目录下; - 修改代码如下:
import org.apache.commons.io.FileUtils; import java.io.File; import java.nio.charset.StandardCharsets; public void configurePostStub() { // 读取请求体文件内容 String expectedRequestBody = FileUtils.readFileToString( new File("src/test/resources/__files/request.json"), StandardCharsets.UTF_8 ); stubFor(post(urlEqualTo("/some/thing")) // 方式1:完全匹配请求体JSON内容 .withRequestBody(equalToJson(expectedRequestBody, true, true)) // 方式2:只匹配请求体里存在createId字段(更灵活,适合不需要完全匹配的场景) // .withRequestBody(matchingJsonPath("$.createId")) .willReturn(aResponse() .withHeader("Content-Type", "application/json") // 指定响应体文件 .withBodyFile("response.json"))); }
注:FileUtils是Apache Commons IO工具类,你也可以用Java原生IO实现文件读取。
让响应包含请求里的创建ID
如果需要响应里的ID和请求体中的createId一致,不用手动生成,直接用WireMock的模板替换功能:
- 在
response.json里用模板变量引用请求体的字段,示例:
{ "id": "{{jsonPath request.body '$.createId'}}", "status": "success", "message": "资源创建成功" }
- 启动WireMock服务器时开启模板引擎:
WireMockServer wireMockServer = new WireMockServer(wireMockConfig() .port(8080) .enableTemplateEngine(true)); // 关键:开启模板替换功能 wireMockServer.start();
这样请求过来时,WireMock会自动把模板变量替换成请求体里实际的createId值。
补充注意事项
- 所有用于匹配或返回的文件,必须放在
__files目录下,否则WireMock无法读取; - 如果需要匹配特定格式的
createId(比如UUID),可以用带正则的matchingJsonPath:.withRequestBody(matchingJsonPath("$.createId", matching("[0-9a-f]{32}")))
内容的提问来源于stack exchange,提问作者Samian
相关产品推荐
相关产品推荐

