web-dev-qa-db-ja.com

RestTemplateをオフラインで使用してクラスを単体テストする方法は?

RestTemplateに直接依存するクラスがあります。オフラインでJUnitテストが欲しいです。

ユニットテストでRestTemplateをモックするにはどうすればよいですか?

30
Dennis C

クライアントコードをremoveRestTemplateへの直接の依存関係にリファクタリングし、RestOperationsによって実装されているインターフェイスであるRestTemplateへの参照に置き換えることをお勧めします。コーディングする必要があるもの。

次に、ユニットテスト用にRestOperationsのスタブまたはモックをコードに挿入し、実際に使用する場合はRestTemplateを挿入できます。

31
skaffman

Spring 3.0ではRestTemplateが導入されました。バージョン3.2以降、 Spring MVCテストフレームワーク は、ユニットテストクライアントにガラス MockRestServiceServer を提供していますRESTコード。

35
Raedwald

Mockクラスをパッケージで使用できます org.springframework.mock.web

通常、 MockHttpServletRequestMockHttpServletResponse が必要になりますが、より詳細な制御が必要な場合は、他のものも必要になる場合があります。 MockRequestDispatcher

これらはどちらも対応するサーブレットインターフェースを実装しますが、テスト用の便利なメソッドを追加します(そして最も重要なことは、実際のHTTP接続なしで機能することです)。

Mockクラスは春のテストjarにあります( Mavenからアクセス可能


更新:結局のところ、上記のクラスはRestTemplateの大きな助けにはならないようです。あなたが必要とするのはモックを作成することです ClientHttpRequestFactory そして、私は上記のパッケージにモックがないことに驚いています。開始するためのコードは次のとおりです(まだテストしていません)。

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

    }


}
5

spring-social-test には、RestTemplateのテストの作成に役立つモックアップクラスが含まれています。 gitリポジトリ内での使用例もいくつかあります(例 OAuth1TemplateTest )。

現在、これらのクラスをspring-webに移動するためのSpring機能リクエスト( #SPR-7951 )があることに注意してください。

3