2015-11-18 78 views
4

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(); 


} 

我明确地传递在SchedulerSchedulers.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()); 
    }); 
} 

看起来有点笨拙,但工程。

任何想法仍然欢迎:)

+0

你试过不是'immediate'其他不同的计划? –

+0

@IgorGanapolsky我也试过AndroidSchedulers.mainthread() – FWeigl

+0

在你的演讲,你有'Schedulers.newThread()',并在测试你'Schedulers.immediate())'。我不知道他们是否有点矛盾... –

回答

1

第一个样品是好的,只是注入UI调度和使用。在你的测试中注入类似于即时调度程序的东西,并在生产中注入Android UI调度程序。一般来说,最好不要在你的类中硬编码依赖关系,而是注入它们。这是依赖注入可以提供帮助的其中一种情况。

了一份关于subscribeOn:你不需要使用它作为改造改造无论如何都会在默认的线程执行操作。另外,命名调度程序“subscribeOn”和“observeOn”没有多大意义,因为您可能想使用相同的调度程序传递给subscribeOn()observeOn()。这将是更好的给他们赋予了更多的意义的名称,他们代表什么,比如“backgroundScheduler”和“uiScheduler”