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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top