0

我正在使用 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 直接连接?还能有什么其他解释?

4

0 回答 0