2016-10-17 20 views
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。)

如何模擬服務器錯誤響應與有用的機構?我錯過了什麼?

回答

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)); 
相關問題