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?