【发布时间】:2017-07-15 16:48:19
【问题描述】:
Android Studio 2.3 RC 1
我正在使用 MVP 架构并希望运行 JVM 单元测试。
在我的模型中,我使用 Retrofit2 和 RxJava 从 API 获取电影。我想测试函数getPopularMovies(...) 但是,这个函数会调用网络服务器。但是,在测试中,我想以某种方式模拟它,只测试调用了 onSuccess() 和 onFailure() 方法。
我的模型类看起来像这样 sn-p 只是为了保持简短:
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() 是否正常工作?
【问题讨论】:
标签: android mockito rx-java retrofit2