私はRestTemplateに直接依存するクラスを持っています。オフラインでJUnitテストをしたいと思っています。RestTemplateをオフラインで使ってクラスをユニットテストする方法は?
私は単体テストでRestTemplateを模擬することができますか?
私はRestTemplateに直接依存するクラスを持っています。オフラインでJUnitテストをしたいと思っています。RestTemplateをオフラインで使ってクラスをユニットテストする方法は?
私は単体テストでRestTemplateを模擬することができますか?
私はにクライアントコードをリファクタリング示唆RestTemplate
上直接依存関係を削除し、RestOperations
への参照に置き換える、ありますRestTemplate
によって実装されたインタフェースあなたがコーディングしなければならないものがあります。
ユニットテストのために、RestOperations
のスタブまたはモックをコードに注入し、それを実際に使用する場合はRestTemplate
を注入できます。
@skaffman氏が言ったことは、一般的に真実で正しいものです。しかし、私は、RestTemplateは、ほとんどの場合、Googleがあなたに連れて行くことを指摘しなければなりません。(@Raedwaldによって指摘されているように) 'MockRestServiceServer'です。さらに、RestOperations状態のJavadoc _直接使用されることはよくありませんが、テスト容易性を高めるための便利なオプションがあります。 – demaniak
後続の質問:RestOperationsを使用し、インスタンスが'Service'実装(テスト中のクラス)によって消費された場合、どのようにして' RestOperations'インスタンスをサービスに入れますか?テストで直接サービスをインスタンス化し、セッターを使用しますか? – demaniak
最近、 'RestTemplate'をモックするのは非常に簡単ですが、' RestOperations'の多くをすべて実装するのは非常に難しいです。 –
パッケージorg.springframework.mock.web
のMockクラスを使用できます。
通常、あなたにはMockHttpServletRequest
とMockHttpServletResponse
が必要ですが、さらに制御が必要な場合は、他にも必要な場合があります。 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();
}
}
}
あなたは私の質問に答えませんでした。あなたのソリューションは、サーバー側サーブレット、MVCフレームワークのテストに役立ちます。 MVCフレームワークを使用するクライアント側をテストします。 –
@Dennis大丈夫、私は答えを更新しました –
これは私が自分のRESTプロジェクトの1つだったのと同じです。どうもありがとう。 – Elwood
spring-social-testには、RestTemplate
のテストの書き込みに役立つモックアップクラスが含まれています。 gitリポジトリ内で使用する方法の例もいくつかあります(例:OAuth1TemplateTest)。
現在、これらのクラスをspring-webに移動するためのSpring機能リクエスト(#SPR-7951)があることに注意してください。
これは***非常に***休憩クライアントをテストするのに便利です。 –
彼らはこれを[spring-test-mvc](http://tinyurl.com/csmuvdz)に移動しました – mfirry
スピニング3.0がRestTemplate
を導入しました。バージョン3.2以来、Spring MVC test frameworkはユニットテストクライアントRESTコード用のクラスMockRestServiceServer
を提供しました。
Androidで利用できますか? – Piotr
@Piotr、これはgradle:androidTestCompile( "org.springframework:spring-test:3.2.8.RELEASE"){ 除外モジュール: "スプリングコア" }で私のために働いています。 – vincentjames501
ここで私の答えをチェックしてくださいhttp://stackoverflow.com/a/22334918/1077708 – vincentjames501