RestTemplateに直接依存するクラスがあります。オフラインでJUnitテストが欲しいです。
ユニットテストでRestTemplateをモックするにはどうすればよいですか?
クライアントコードをremoveRestTemplate
への直接の依存関係にリファクタリングし、RestOperations
によって実装されているインターフェイスであるRestTemplate
への参照に置き換えることをお勧めします。コーディングする必要があるもの。
次に、ユニットテスト用にRestOperations
のスタブまたはモックをコードに挿入し、実際に使用する場合はRestTemplate
を挿入できます。
Spring 3.0ではRestTemplate
が導入されました。バージョン3.2以降、 Spring MVCテストフレームワーク は、ユニットテストクライアントにガラス MockRestServiceServer
を提供していますRESTコード。
Mockクラスをパッケージで使用できます org.springframework.mock.web
。
通常、 MockHttpServletRequest
と MockHttpServletResponse
が必要になりますが、より詳細な制御が必要な場合は、他のものも必要になる場合があります。 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();
}
}
}
spring-social-test には、RestTemplate
のテストの作成に役立つモックアップクラスが含まれています。 gitリポジトリ内での使用例もいくつかあります(例 OAuth1TemplateTest )。
現在、これらのクラスをspring-webに移動するためのSpring機能リクエスト( #SPR-7951 )があることに注意してください。