2016-10-17 1 views
0

Ich versuche einen Integrationstest eines RESTful-Dienstes zu schreiben, der unter bestimmten Umständen mit einem 500 Serverfehler antwortet, aber trotzdem einen nützlichen Antworttext mit zurückgibt eine Nachricht, die das Problem beschreibt. Um diese Reaktion Körper zu bekommen, nutzt mein Code eine benutzerdefinierte Fehlerbehandlung, so etwas wie:Integration-Test Spring's RestTemplate mit MockRestServiceServer - mit zurückgegebenen Körper trotz 500 Fehler

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()); 
    } 
} 

fein Das funktioniert, wie auch den Integrationstest für eine „gesunde“ Antwort:

@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(); 
} 

(wo HEALTHY_RESPONSE natürlich ist eine statische erwartete gesunde Reaktion in JSON.)

Aber selbst wenn ich die gleichen Fehler-Handler in meinem Integrationstest für die „ungesunde“ Antwort gesetzt, bekomme ich

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 wie oben ist, außer die Erwartung ist:

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

(Dies ist mit Feder-web-4.1.7 der RestTemplate und Feder-test-4.1.7 der MockRestServiceServer.)

Wie simuliere ich eine Serverfehlerantwort mit einem nützlichen Körper? Was vermisse ich?

Antwort

0

Habe es funktioniert - die Fehlermeldung war ein wenig irreführend, aber die and content type [application/octet-stream] sollte mir einen Hinweis gegeben haben.

Alles, was ich tun musste (DOH) den Medientyp auf der Erwartung festgelegt wurde:

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