使用WireMock测试HttpRequest遇400错误,无法获取预期响应体
核心错误点
编程式Stub响应体配置完全错误:你在
willReturn(aResponse()).withBodyFile("**responseGet.json**")里犯了两个关键问题:- 文件名多了多余的
**,更致命的是——responseGet.json是WireMock的请求映射规则文件,不是响应体文件,直接把它作为返回内容完全不符合逻辑。编程式Stub要返回body.json的内容,应该直接写withBodyFile("body.json")。 - WireMock的目录规则是:
__files存放响应体文件,mappings存放请求映射规则文件,你把映射规则文件放在__files下本身就不符合规范。
- 文件名多了多余的
URL路径不匹配:你的Stub用
get(FilterBuilderImpl.URI_PATH)匹配路径,但实际请求的URL是wireMockServer.url(completeUrl),如果两者路径不一致,WireMock找不到对应Stub就会返回400错误。GET请求携带Content-Type头不符合HTTP规范:虽然不是直接触发400的原因,但GET请求没有请求体,不需要Content-Type头,这可能导致WireMock的头匹配逻辑出现预期外的不匹配。
修复步骤
修正编程式Stub的响应配置
把Stub中的withBodyFile("**responseGet.json**")改成withBodyFile("body.json"),同时移除GET请求的Content-Type头匹配规则:wireMockServer.stubFor(get(FilterBuilderImpl.URI_PATH) .withHeader("Connection", containing("close")) .withHeader("Authorization", containing(filterBuilder.getAuthorization())) .willReturn(aResponse() .withHeader("Connection", "close") .withHeader("Content-Type", "application/json") .withBodyFile("body.json")));确保URL路径完全匹配
检查FilterBuilderImpl.URI_PATH的值是否和completeUrl对应的路径一致。比如如果completeUrl是/objectserver/restapi/alerts/status,那么FilterBuilderImpl.URI_PATH也必须是这个值,或者用WireMock的路径匹配方法(如urlPathEqualTo("/objectserver/restapi/alerts/status"))。移除请求中的Content-Type头
删掉GET请求里的Content-Type头配置,符合HTTP规范:final HttpRequest request = HttpRequest.newBuilder() .header("Connection", "close") .header("Authorization", filterBuilder.getAuthorization()) .uri(URI.create(wireMockServer.url(completeUrl))) .GET() .build();若想用静态映射文件(responseGet.json)
把responseGet.json移动到mappings目录下,删除代码中的编程式Stub配置,WireMock会自动加载该规则。同时修正文件里的语法错误(headers节点最后多了一个逗号):{ "request": { "method": "GET", "url": "/objectserver/restapi/alerts/status", "headers": { "Connection": { "contains": "close" }, "Authorization": { "contains": "YOUR_AUTH_VALUE" } } }, "response": { "headers": {"Connection": "close","Content-Type": "application/json"}, "status": 200, "bodyFileName": "body.json" } }
验证修复
完成以上调整后,WireMock会匹配到正确的Stub,返回body.json的内容,响应头的Content-Type会显示为application/json,不再返回400错误页面。
内容的提问来源于stack exchange,提问作者Gabriel Huerta

