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())'。我不知道他們是否有點矛盾... –