RestTemplateに直接依存するクラスがあります。オフラインでJUnitテストを実行したいのですが。
ユニットテストでRestTemplateをモックするにはどうすればよいですか?
RestTemplateに直接依存するクラスがあります。オフラインでJUnitテストを実行したいのですが。
ユニットテストでRestTemplateをモックするにはどうすればよいですか?
クライアント コードをリファクタリングして、 への直接的な依存関係を削除し、 によって実装されるインターフェイスであるRestTemplate
への参照に置き換えることをお勧めします。そして、コーディングする必要があるもの。RestOperations
RestTemplate
RestOperations
次に、単体テスト用にスタブまたはモックをコードに挿入RestTemplate
し、実際に使用するときに a を挿入できます。
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();
}
}
}
spring-social-testには、 のテストを作成するのに役立つモックアップ クラスが含まれていますRestTemplate
。git リポジトリ内での使用方法の例もいくつかあります (例: OAuth1TemplateTest )。
現在、これらのクラスを spring-web に移動するための Spring 機能要求 ( #SPR-7951 )があることに注意してください。