Question

J'ai une classe qui a la dépendance directe du RestTemplate. Je voudrais avoir un test JUnit de celui-ci, hors ligne.

Comment pourrais-je se moquer d'un RestTemplate dans mon unittest?

Était-ce utile?

La solution

Je suggère refactorisation votre code client supprimer la dépendance directe sur RestTemplate, et le remplacer par des références à RestOperations, qui est l'interface implémentée par RestTemplate. et celle que vous devriez être à codage.

Vous pouvez ensuite injecter un talon ou une maquette de RestOperations dans votre code pour les tests unitaires et injecter un RestTemplate lorsque vous l'utilisez pour de vrai.

Autres conseils

Sping 3.0 introduit RestTemplate. Depuis la version 3.2, le printemps framework de test MVC a fourni la classe MockRestServiceServer pour le code client test unité REST.

Vous pouvez utiliser les classes simulées dans le paquet org.springframework.mock.web .

En général, vous aurez besoin MockHttpServletRequest et MockHttpServletResponse , mais si vous avez besoin de plus de contrôle, vous pouvez aussi avoir besoin d'autres, par exemple MockRequestDispatcher .

Ces deux implémenter les interfaces Servlet correspondantes, mais ajouter des méthodes pratiques pour tester (et, surtout: ils travaillent sans réelle connexion HTTP).

Vous pouvez trouver les classes simulées dans le pot-test de printemps ( accessibles par Maven )


Mise à jour: il semble que les classes ci-dessus ne sont pas une grande aide pour RestTemplate après tout. Ce que vous aurez besoin est de créer une maquette ClientHttpRequestFactory , et je suis surpris de voir qu'il n'y a pas un dans le paquet ci-dessus. Voici un code pour vous aider à démarrer (ont pas testé):

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

    }


}

printemps-social essai contient des classes mockup que les tests d'écriture pour l'aide RestTemplate. Il y a aussi quelques exemples sur la façon de l'utiliser dans le dépôt git (par exemple OAuth1TemplateTest ).

S'il vous plaît garder à l'esprit qu'il ya actuellement une demande de fonctionnalité Spring ( #-7951 SPR ) pour déplacer ces classes au printemps web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top