我正在使用Wiremock测试Java REST客户端,特别是它如何处理空响应。
受测试代码:
public Content makeRequest(...) {
try {
ResponseEntity response = restTemplate.exchange(...);
if(response.getStatusCode() != 200) {
throw new BadStatusCodeException(response.getStatusCode());
}
return extractContent(response);
} catch (IOException e) {
throw new ProtocolException(e);
}
}
测试:
Wiremock.stubFor(put(urlPathEqualTo("/foo"))
.willReturn(aResponse().withFault(EMPTY_RESPONSE)));
thrown.expect(ProtocolException.class);
client.makeRequest();
此测试在我的本地计算机上传递,但在我们的构建计算机上它失败,抛出状态码为500的BadStatusException
。
我最好的猜测是,在我的本地机器上,RestTemplate正在与Wiremock服务器建立直接连接,但是在构建机器上,连接是通过代理进行的 - 可能是因为环境变量等 - 并且代理在遇到WireMock模拟的错误时返回500错误。
强迫我的RestTemplate
使用Apache HttpClient,如下所示:
ClientHttpRequestFactory httpRequestFactory =
new HttpComponentsAsyncClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
...似乎解决了这个问题,但我真的不想将额外的依赖项带入这个库(这个库的使用者将注入他们自己的RestTemplate,但他们喜欢配置它们。)
我的理论是否合情合理?我如何验证这是发生了什么?如何强制RestTemplate直接连接?还有什么其他解释?