2016-10-17 9 views
0

Я пытаюсь написать интеграционный тест службы RESTful, который в определенных обстоятельствах отвечает на ошибку сервера 500, но при этом возвращает полезный орган ответа с сообщение с подробным описанием проблемы. Для того, чтобы получить это тело ответа, мой код использует обработчик ошибок, что-то вроде:Интеграция-тестирование SpringTemplate Spring с MockRestServiceServer - с использованием возвращаемого тела, несмотря на 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] 

Setup, как выше, за исключением того, ожидание:

mockServer.expect(requestTo("/someUri")).andExpect(method(HttpMethod.GET)) 
    .andRespond(withServerError().body(UNHEALTHY_RESPONSE)); 

(Это с помощью пружинно-веб-4.1.7 в RestTemplate и MockRestServiceServer весна-х испытаний 4.1.7.)

Как смоделировать ответ ошибки сервера с полезным телом? Что мне не хватает?

ответ

0

Got it working - сообщение об ошибке было немного вводить в заблуждение, но and content type [application/octet-stream] должен был дать мне подсказку.

Все, что мне нужно сделать (DOH) был установлен тип носителя на ожидание:

mockServer.expect(requestTo("/someUri")).andExpect(method(HttpMethod.GET)) 
    .andRespond(withServerError().body(UNHEALTHY_RESPONSE) 
    .contentType(MediaType.APPLICATION_JSON));