Android Studio 2.3 RC 1
我正在使用MVP體系結構並希望運行JVM單元測試。使用Mockito進行JVM單元測試以測試Retrofit2和RxJava的網絡請求
在我的模型中,我使用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(...),thenReturn。模擬MovieAPIService.getPopular(..)以返回正確的結果。然後我驗證正確的onFailure()和onSuccess()被稱爲正確的次數。這只是測試業務邏輯,而不是對網絡進行真正的呼叫。測試獨立於任何外部依賴。 – ant2009