Wie eine Klasse Unittest mit RestTemplate offline?
-
09-10-2019 - |
Frage
ich eine Klasse, die auf dem RestTemplate direkte Abhängigkeit hat. Ich wünschte, ich habe einen JUnit-Test davon, offline.
Wie kann ich eine RestTemplate in meiner Unittest verspotten?
Lösung
Ich schlage vor, Refactoring Ihren Client-Code zu Entfernen die direkte Abhängigkeit von RestTemplate
, und ersetzt sie durch Verweise auf RestOperations
, die die Schnittstelle von RestTemplate
implementiert ist. und die, die Sie sollten seine Codierung.
Sie können dann inject einem Stummel oder mock von RestOperations
in Ihren Code für Unit-Tests und inject eine RestTemplate
wenn es wirklich verwendet wird.
Andere Tipps
Sping 3.0 eingeführt RestTemplate
. Seit der Version 3.2, der Frühling MVC-Test-Framework die Klasse MockRestServiceServer
für Unit-Tests Client REST-Code.
Sie können die Mock-Klassen in Paket verwenden org.springframework.mock.web
.
In der Regel müssen Sie MockHttpServletRequest
und MockHttpServletResponse
, aber wenn Sie mehr Kontrolle benötigen Sie möglicherweise auch andere benötigen, zB MockRequestDispatcher
.
Beide die entsprechenden Servlet-Schnittstellen implementieren, aber bequeme Methoden zum Testen werden (und, was am wichtigsten ist: Sie arbeiten ohne eine echte HTTP-Verbindung).
Sie können die Mock-Klassen im Frühjahr Test jar finden ( zugänglich durch Maven )
Update: es scheint, dass die oben genannten Klassen sind keine große Hilfe für RestTemplate
nachdem alle. Was Sie brauchen, ist ein Mock ClientHttpRequestFactory
, und ich bin überrascht zu sehen, dass es nicht in dem obigen Paket. Hier ist ein Code zum Einstieg (habe es nicht getestet):
public class MockClientHttpRequestFactory implements
ClientHttpRequestFactory{
// overwrite this if you want
protected MockClientHttpResponse createResponse(){
return new MockClientHttpResponse();
}
// or this
protected HttpStatus getHttpStatusCode(){
return HttpStatus.OK;
}
// or even this
@Override
public ClientHttpRequest createRequest(final URI uri,
final HttpMethod httpMethod) throws IOException{
return new MockClientHttpRequest(uri, httpMethod);
}
public class MockClientHttpResponse implements ClientHttpResponse{
private final byte[] data = new byte[10000];
private final InputStream body = new ByteArrayInputStream(data);
private final HttpHeaders headers = new HttpHeaders();
private HttpStatus status;
@Override
public InputStream getBody() throws IOException{
return body;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
@Override
public HttpStatus getStatusCode() throws IOException{
return getHttpStatusCode();
}
@Override
public String getStatusText() throws IOException{
return status.name();
}
@Override
public void close(){
try{
body.close();
} catch(final IOException e){
throw new IllegalStateException(e);
}
}
}
class MockClientHttpRequest implements ClientHttpRequest{
private final HttpHeaders headers = new HttpHeaders();
private final HttpMethod method;
private final URI uri;
private final OutputStream body = new ByteArrayOutputStream();
MockClientHttpRequest(final URI uri, final HttpMethod httpMethod){
this.uri = uri;
method = httpMethod;
}
@Override
public OutputStream getBody() throws IOException{
return body;
}
@Override
public HttpHeaders getHeaders(){
return headers;
}
@Override
public HttpMethod getMethod(){
return method;
}
@Override
public URI getURI(){
return uri;
}
@Override
public ClientHttpResponse execute() throws IOException{
return createResponse();
}
}
}
federsozial Test Mockup Klassen enthält, die helfen, Schreibtests für RestTemplate
. Es gibt auch einige Beispiele, wie es im Git-Repository zu verwenden (zB OAuth1TemplateTest ).
Beachten Sie bitte, dass es derzeit ein Frühling Feature-Request ( # SPR-7951 ) diese Klassen feder Bahn zu bewegen.