2011-01-10 16 views

答えて

31

私はにクライアントコードをリファクタリング示唆RestTemplate直接依存関係を削除し、RestOperationsへの参照に置き換える、ありますRestTemplateによって実装されたインタフェースあなたがコーディングしなければならないものがあります。

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

+0

@skaffman氏が言ったことは、一般的に真実で正しいものです。しかし、私は、RestTemplateは、ほとんどの場合、Googleがあなたに連れて行くことを指摘しなければなりません。(@Raedwaldによって指摘されているように) 'MockRestServiceServer'です。さらに、RestOperations状態のJavadoc _直接使用されることはよくありませんが、テスト容易性を高めるための便利なオプションがあります。 – demaniak

+0

後続の質問:RestOperationsを使用し、インスタンスが'Service'実装(テスト中のクラス)によって消費された場合、どのようにして' RestOperations'インスタンスをサービスに入れますか?テストで直接サービスをインスタンス化し、セッターを使用しますか? – demaniak

+1

最近、 'RestTemplate'をモックするのは非常に簡単ですが、' RestOperations'の多くをすべて実装するのは非常に難しいです。 –

5

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

通常、あなたにはMockHttpServletRequestMockHttpServletResponseが必要ですが、さらに制御が必要な場合は、他にも必要な場合があります。 MockRequestDispatcher

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

あなたは春試験ジャー(accessible through 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(); 
     } 

    } 


} 
+1

あなたは私の質問に答えませんでした。あなたのソリューションは、サーバー側サーブレット、MVCフレームワークのテストに役立ちます。 MVCフレームワークを使用するクライアント側をテストします。 –

+0

@Dennis大丈夫、私は答えを更新しました –

+1

これは私が自分のRESTプロジェクトの1つだったのと同じです。どうもありがとう。 – Elwood

3

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

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

+0

これは***非常に***休憩クライアントをテストするのに便利です。 –

+1

彼らはこれを[spring-test-mvc](http://tinyurl.com/csmuvdz)に移動しました – mfirry

35

スピニング3.0がRestTemplateを導入しました。バージョン3.2以来、Spring MVC test frameworkはユニットテストクライアントRESTコード用のクラスMockRestServiceServerを提供しました。

+0

Androidで利用できますか? – Piotr

+1

@Piotr、これはgradle:androidTestCompile( "org.springframework:spring-test:3.2.8.RELEASE"){ 除外モジュール: "スプリングコア" }で私のために働いています。 – vincentjames501

関連する問題