我正在尝试编写RESTful服务的集成测试,在某些情况下,它会响应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中静态预期的健康响应。)
但即使我在我的集成测试中为&#34;不健康&#34;设置了相同的错误处理程序。回应,我得到了
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));
(这是使用spring-web-4.1.7&#39; RestTemplate
和spring-test-4.1.7&#39; MockRestServiceServer
。
如何使用有用的正文模拟服务器错误响应?我错过了什么?
答案 0 :(得分:0)
搞定了 - 错误信息有点误导,但and content type [application/octet-stream]
应该给我一个提示。
所有我需要做的事情(doh)都按预期设置了媒体类型:
mockServer.expect(requestTo("/someUri")).andExpect(method(HttpMethod.GET))
.andRespond(withServerError().body(UNHEALTHY_RESPONSE)
.contentType(MediaType.APPLICATION_JSON));