使用WIREMOCK编写测试时遇请求不匹配问题求助
核心问题根源
错误提示里的CONNECT方法+URL为null,本质是你的HTTP客户端没有直接向WireMock发起GET请求,而是尝试建立HTTP隧道连接——通常是因为请求URL格式错误,或者客户端被配置了全局代理,导致请求走向异常。
具体排查与解决步骤
修正HttpRequest的URL构建逻辑
你的代码里用相对路径/greeting构建HttpRequest,如果httpService.execute没有自动拼接WireMock的base URL(比如http://localhost:8080),客户端会把相对路径判定为无效URL,进而发起CONNECT隧道请求。
解决:构建请求时使用完整URL,示例:String fullUrl = helloProperties.getHttp().getBaseUrl() + "/greeting"; HttpRequest httpRequest = HttpRequest.builder(fullUrl).get().addHeaders(generateHttpHeaders()).build();或者确认
httpService.execute内部会自动将urlPart与helloProperties.getHttp()中的base URL拼接。检查全局代理配置
如果应用配置了全局HTTP代理,且未将WireMock地址加入代理白名单,客户端会把请求发往代理服务器,而非直接到WireMock,这就会触发CONNECT隧道请求。
解决:测试环境中禁用全局代理,或调整代理规则,排除WireMock的目标地址。验证WireMock的监听地址与端口
确保WireMock启动的地址、端口,和helloProperties.getHttp()中配置的base URL完全一致。比如WireMock默认监听localhost:8080,如果配置里是其他地址,请求会发错目标,间接引发异常。调试实际请求内容
在测试中添加日志,打印httpRequest的完整URL和请求方法;或者开启WireMock的--verbose模式查看请求日志,确认实际收到的请求细节,验证是否真的是CONNECT请求,以及请求的目标地址。
补充代码调整建议
你的WireMock Stub配置本身是正确的,但可以明确指定WireMock的端口,避免端口冲突:
// JUnit5环境下用扩展指定WireMock端口 @RegisterExtension static WireMockExtension wireMock = WireMockExtension.newInstance() .options(wireMockConfig().port(8080)) .build(); // 用wireMock实例创建Stub wireMock.stubFor(get("/greeting").willReturn(aResponse() .withStatus(HttpStatus.OK.value()) .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .withBody(jsonResponse)));
内容的提问来源于stack exchange,提问作者Kalhara

