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 を強制的に直接接続するにはどうすればよいですか? 他にどのような説明があり得るでしょうか?