Android Studio 2.3 RC 1
私はMVPアーキテクチャを使用しており、JVMユニットテストを実行します。ネットワークリクエスト用のRetrofit2とRxJavaをテストするためのMockitoによるJVMユニットテスト
私のモデルでは、Retrofit2とRxJavaを使用してAPIからムービーを取得しています。私は関数をテストしたいgetPopularMovies(...)
しかし、この関数は、Webサーバーを呼び出します。しかし、テストでは何とか模倣したいだけで、onSuccess()
とonFailure()
というメソッドが呼び出されてテストします。
私のモデルクラスは短いそれを維持するために、このスニペットのようになります。
public class MovieListModelImp implements MovieListModelContract {
@Override
public void getPopularMovies(PopularMovieResultsListener popularMovieResultsListener) {
mSubscription = mMovieAPIService.getPopular(Constants.MOVIES_API_KEY)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Results>() {
@Override
public void onCompleted() {
Timber.d("onCompleted");
}
@Override
public void onError(Throwable e) {
Timber.e(e, "onError");
popularMovieResultsListener.onFailure(e.getMessage());
}
@Override
public void onNext(Results results) {
Timber.d("onNext %d", results.getResults().size());
popularMovieResultsListener.onSuccess(results);
}
});
}
}
およびインターフェイス:私が解決しようとしています
public interface MovieListModelContract {
interface PopularMovieResultsListener {
void onFailure(String errorMessage);
void onSuccess(Results popularMovies);
}
void getPopularMovies(PopularMovieResultsListener popularMovieResultsListener);
}
私の問題は、私がテストをMockitoを使用する方法でありますgetPopularMovies
実際にネットワークサービスを呼び出すことなく popularMoviesResultsListener.onFailure(e.getMessage())
が映画 を取得するために失敗した場合に呼び出され、映画は私はこのようなテストを持っているが、私はこれが正しいかどうかを確認していない
popularMovieResultsListener.onSuccess(results);
が成功した場合に呼び出されます:私はちょうどそれをテストしたいです:
@Test
public void shouldDisplaySuccessWhenNetworkSucceeds() {
/* Results is the movie results class that is returned */
Results results = new Results();
/* Mock the listener */
MovieListModelContract.PopularMovieResultsListener mockPopularMoviesResultsListener =
Mockito.mock(MovieListModelContract.PopularMovieResultsListener.class);
/* Real instance of the model */
MovieListModelImp movieListModelImp = new MovieListModelImp();
/* Call getPopularMovies with mock listener - However, this will still make a real network request */
movieListModelImp.getPopularMovies(mockPopularMoviesResultsListener);
/* Verify - but I think I have got this all wrong */
verify(mockPopularMoviesResultsListener, times(1)).onSuccess(results);
}
だから私の問題は、私はネットワーク要求への呼び出しを模擬し、期待するonSuccessを(テストする方法である)とONFAILURE()が正常に動作していますか?
あなたのクラスを単体テストするのに必要な実際のネットワークリクエストを嘲笑していないと思います。私は私の答えでこれを解決しようとしました:) –
@PravinSonawaneそれは私の間違いでした。テスト用に間違ったコードスニペットを貼り付けました。私は今私の答えを更新しました。ここで私はwhen(...)。then returnを使用しています。 MovieAPIService.getPopular(..)をモックして正しい結果を返すには次に、正しいonFailure()とonSuccess()が正しい回数呼び出されたことを確認します。これはビジネスロジックをテストするだけで、ネットワークへの実際の呼び出しを行わないことです。このテストは、外部依存関係から独立しています。 – ant2009