I have the following method that uses Retrofit to retrieve some data from the API, and then interacts with the viewinterface.
@Override
@VisibleForTesting
public void fetchPhotos(@Nullable PhotosService service, @Nullable Scheduler subscribeOn) {
view.showLoading();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.PLACEHOLDER_API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
if (service == null) service = retrofit.create(PhotosService.class);
if (subscribeOn == null) subscribeOn = Schedulers.newThread();
service.listPhotos()
.subscribeOn(subscribeOn)
.observeOn(AndroidSchedulers.mainThread())
.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());
});
}
I want to check what view.unshowLoading()is being called on onNext.
Here is my test:
@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();
}
I explicitly pass in Scheduler Schedulers.immediate()to make sure it onNext()gets called instantly on the subscription topic.
When I debug my method, onNext()it is not called. What am I doing wrong or how can I best verify this?
EDIT: This article led me to something:
, 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());
});
}
, .
- :)