レストテンプレートをオフラインで使用してクラスを無視するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4643105

質問

RESTテンプレートに直接依存しているクラスがあります。オフラインでジュニットテストがあればいいのにと思います。

最新の状態でレストテンプレートをock笑するにはどうすればよいですか?

役に立ちましたか?

解決

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

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

他のヒント

スピング3.0が導入されました RestTemplate. 。バージョン3.2以来、 スプリングMVCテストフレームワーク クラスを提供しました MockRestServiceServer クライアントレストコードのユニットテスト用。

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

通常、必要になります MockHttpServletRequestMockHttpServletResponse, 、しかし、より多くのコントロールが必要な場合は、他の人も必要になる場合があります。 MockRequestDispatcher.

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

スプリングテストの瓶でモッククラスを見つけることができます(Mavenからアクセスできます)


アップデート: 上記のクラスは大きな助けにならないようです RestTemplate 結局。必要なのは、模擬を作成することです ClientHttpRequestFactory, 、そして、上記のパッケージに1つがないことに驚いています。開始するためのコードを次に示します(テストしていません):

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

    }


}

春の社会テスト テストの書き込みに役立つモックアップクラスが含まれています RestTemplate. 。 gitリポジトリ内でそれを使用する方法についてもいくつかの例があります(例: OAUTH1TEMPLATETEST).

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top