レストテンプレートをオフラインで使用してクラスを無視するにはどうすればよいですか?
-
09-10-2019 - |
質問
RESTテンプレートに直接依存しているクラスがあります。オフラインでジュニットテストがあればいいのにと思います。
最新の状態でレストテンプレートをock笑するにはどうすればよいですか?
解決
クライアントコードをリファクタリングすることをお勧めします 削除する 直接的な依存 RestTemplate
, 、そしてそれを参照に置き換えます RestOperations
, 、これがによって実装されたインターフェイスです RestTemplate
. 。そして、あなたがコーディングするべきもの。
その後、スタブまたはモックを注入できます RestOperations
ユニットテストのためのコードに RestTemplate
実際に使用する場合。
他のヒント
スピング3.0が導入されました RestTemplate
. 。バージョン3.2以来、 スプリングMVCテストフレームワーク クラスを提供しました MockRestServiceServer
クライアントレストコードのユニットテスト用。
パッケージでモッククラスを使用できます org.springframework.mock.web
.
通常、必要になります MockHttpServletRequest
と MockHttpServletResponse
, 、しかし、より多くのコントロールが必要な場合は、他の人も必要になる場合があります。 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に移動します。