2015-11-18 79 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」