使用MockRestServiceServer集成测试Spring的RestTemplate - 使用返回的正文尽管有500个错误

时间:2016-10-17 06:59:36

标签: java spring integration-testing resttemplate

我正在尝试编写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

如何使用有用的正文模拟服务器错误响应?我错过了什么?

1 个答案:

答案 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));