RxJava的onNext我有一个使用Retrofit服务接口,用于从一个API取一些数据如下方法,然后用view
接口交互。我想测试view.unshowLoading()
在onNext中调用。验证方法被称为在订户
这里是我的测试:
@Test
public void viewUnshowsLoadingAfterFetchingPhotos() {
PhotosListView view = Mockito.mock(PhotosListView.class);
PhotosListPresenter presenter = new PhotosListPresenterImpl(view);
presenter.fetchPhotos(() -> Observable.create(new Observable.OnSubscribe<List<Photo>>() {
@Override
public void call(Subscriber<? super List<Photo>> subscriber) {
subscriber.onNext(new ArrayList<Photo>());
}
}), Schedulers.immediate());
Mockito.verify(view).unshowLoading();
}
我明确地传递在Scheduler
Schedulers.immediate()
确保onNext()
立即被称为订阅线程。
当我通过我的方法调试不过,onNext()
不叫。 我在做什么错,或者我怎么能最好地测试这个?
编辑:This article带我到的东西:
如果你想改变在其上进行操作的线程 你可以调用subscribeOn()。要回到主线程,使用 observeOn(AndroidSchedulers.mainThread())。但是,请注意 当你强制执行该操作在一个特定的线程,它会 总是认购asynchronou秒。
当我省略了
.subscribeOn(subscribeOn)
.observeOn(AndroidSchedulers.mainThread())
部分,测试按预期工作。我重新安排我的方法没有呼叫observeOn()
或subscribeOn()
当没有调度中传递:
public void fetchPhotos(@Nullable PhotosService service, @Nullable Scheduler subscribeOn, @Nullable Scheduler observeOn) {
view.showLoading();
if (service == null) service = createService();
Observable<List<Photo>> observable = service.listPhotos();
if (subscribeOn != null) observable = observable.subscribeOn(subscribeOn);
if (observeOn != null) observable = observable.observeOn(observeOn);
observable.subscribe(photoList -> {
Log.d(TAG, "got photos " + photoList.toString());
view.unshowLoading();
}, throwable -> {
Log.d(TAG, "error " + throwable.toString());
view.unshowLoading();
view.displayError(throwable.toString(), v -> fetchPhotos());
});
}
看起来有点笨拙,但工程。
任何想法仍然欢迎:)
你试过不是'immediate'其他不同的计划? –
@IgorGanapolsky我也试过AndroidSchedulers.mainthread() – FWeigl
在你的演讲,你有'Schedulers.newThread()',并在测试你'Schedulers.immediate())'。我不知道他们是否有点矛盾... –