30

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

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

4

4 に答える 4

31

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

RestOperations次に、単体テスト用にスタブまたはモックをコードに挿入RestTemplateし、実際に使用するときに a を挿入できます。

于 2011-01-10T10:48:32.787 に答える
5

package の Mock クラスを使用できますorg.springframework.mock.web

通常は と が必要MockHttpServletRequestですMockHttpServletResponseが、さらに制御が必要な場合は、 などの他のものも必要になる場合がありますMockRequestDispatcher

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

spring-test jar で Mock クラスを見つけることができます ( Maven からアクセスできます)


更新:RestTemplate結局のところ、上記のクラスはあまり役に立たないようです。必要なのは mock を作成すること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();
        }

    }


}
于 2011-01-10T08:40:37.553 に答える
3

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

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

于 2011-04-20T09:16:33.657 に答える