0
我正在嘗試編寫一個RESTful服務的集成測試,在某些情況下,它會響應500
服務器錯誤,但仍返回一個有用的響應主體詳細說明問題的消息。爲了獲得這種反應的身體,我的代碼使用一個自定義的錯誤處理程序,是這樣的:使用MockRestServiceServer集成測試Spring的RestTemplate - 使用返回的主體,儘管發生了500錯誤
public class Allow500ResponseErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
HttpStatus statusCode = response.getStatusCode();
return !HttpStatus.OK.equals(statusCode)
&& !HttpStatus.INTERNAL_SERVER_ERROR.equals(statusCode);
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
log.error("Unexpected response code: {} {}", response.getStatusCode(),
response.getStatusText());
}
}
這工作得很好,象一個「健康」的響應集成測試:
@Test
public void testHealthyResponse() {
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
mockServer.expect(requestTo("/someUri")).andExpect(method(HttpMethod.GET))
.andRespond(withSuccess(HEALTHY_RESPONSE, MediaType.APPLICATION_JSON));
restTemplate.setErrorHandler(new Allow500ResponseErrorHandler());
MyCustomResult result = restTemplate
.exchange("/someUri", HttpMethod.GET, null,
new ParameterizedTypeReference<MyCustomResult>() {
}).getBody();
// assertThat(... tests go here...);
mockServer.verify();
}
(其中當然HEALTHY_RESPONSE
是JSON靜態預期的健康反應。)
但即使我設置了同樣的錯誤處理程序在我的集成測試,爲「不健康」的迴應,我得到
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class my.package.MyCustomResult] and content type [application/octet-stream]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:110)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:809)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:793)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:572)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:476)
at [my test code]
設置是像上面,除了期望是:
mockServer.expect(requestTo("/someUri")).andExpect(method(HttpMethod.GET))
.andRespond(withServerError().body(UNHEALTHY_RESPONSE));
(這是使用彈簧的web-4.1.7的RestTemplate
和彈簧體檢查4.1.7的MockRestServiceServer
。)
如何模擬服務器錯誤響應與有用的機構?我錯過了什麼?