我正在使用 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();
这个测试在我的本地机器上通过了,但是在我们的构建机器上它失败了,抛出一个BadStatusException
状态码 500。
我最好的猜测是,在我的本地机器上,RestTemplate 直接连接到 Wiremock 服务器,但是在构建机器上,连接是通过代理进行的——可能是因为环境变量等——并且代理遇到 WireMock 模拟的故障时返回 500 错误。
强制我RestTemplate
使用 Apache HttpClient,如下所示:
ClientHttpRequestFactory httpRequestFactory =
new HttpComponentsAsyncClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
...似乎解决了这个问题,但我真的不想在这个库中引入额外的依赖项(这个库的使用者将注入他们自己的 RestTemplate,按照他们喜欢的方式进行配置)。
我的理论可信吗?我如何验证这是正在发生的事情?如何强制 RestTemplate 直接连接?还能有什么其他解释?