2017-05-19 42 views
1

Observable是final類,所以我們不能爲它創建模擬來驗證或捕獲對它執行的任何交互。如何使用Mockito驗證RxJava2上沒有交互Observable

和可觀的test(),TestSubscriber也沒有提供任何這種互動斷言techinque

我已經從網絡

/** 
* General parametrized method for loading data from service while checking connection 
* and respecting reload state 
*/ 
private <T> Observable<T> getData(Observable<T> dataSource, String key, boolean reload) { 
    T cachedData = (T) cacheModel.getValue(key); 

    // Do not use cache if reloading 
    if(!reload && cachedData != null) 
     return Observable.just(cachedData); 

    if(!utilModel.isConnected()) { 
     return Observable.error(new Throwable(Constants.NO_NETWORK)); 
    } 

    return dataSource 
     .doOnNext(data -> cacheModel.saveObject(key, data)) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

裝載和使用如下之前創建的檢查緩存數據的通用方法:

@Override 
public Observable<User> getOrganiser(boolean reload) { 
    return getData(eventService.getUser(authorization), ORGANIZER, reload); 
} 

之前,我甚至沒有打電話eventService.getUser(...)得到觀察,所以我可以te st如果它從來沒有被調用,但現在,因爲我必須將它傳遞給模板方法,所以我需要調用它,但是驗證緩存是否存在,它從不與之交互。

這是我以前的測試,這顯然是現在失敗

@Test 
public void shouldLoadOrganizerFromCache() { 
    // Clear cache 
    objectCache.clear(); 

    User user = new User(); 
    objectCache.saveObject(RetrofitEventRepository.ORGANIZER, user); 

    // No force reload ensures use of cache 
    Observable<User> userObservable = retrofitEventModel.getOrganiser(false); 

    userObservable.test().assertNoErrors(); 
    userObservable.test().assertValue(user); 

    verify(eventService, never()).getUser(auth); 
} 

回答

1

假設你要測試的可觀察是這樣的:

Observable<User> userObservable = getData(eventService.getUser(authorization)); 

,而你不能直接test()方法使用或者在您將輸入Observable轉交給另一個實體時訂閱TestObserver。您可以使用Observable副作用方法來驗證幾乎與Observable的任何交互。
例如在你的情況,你可以使用doOnSubscribe並提出一個標誌,如果它被稱爲(指示服務方法被調用,同時也不應緩存應該被調用):

final boolean[] serviceCalled = new boolean[1]; 
Observable<User> userServiceObservable = eventService.getUser(authorization) 
      .doOnSubscribe(disposable -> serviceCalled[0] = true); 

Observable<User> userObservable = getData(userServiceObservable, ORGANIZER, reload); 
userObservable.test() 
     .assertNoErrors() 
     .assertValue(user) 
     .awaitTerminalEvent(); 
Assert.assertEquals(false, serviceCalled[0]); 

順便說一句,你的緩存方法可能無法按預期工作,因爲您在測試緩存時獲取Observable而不是在訂閱時測試緩存,因此緩存狀態在訂閱時可能會有所不同。多次調用也可能同時發生,導致多次調用服務器並更新緩存,您可以使用Observable.defer()看到我的緩存建議here

+0

隨着時間的推移,測試訂閱者將進行的交互變得很僵化,因爲我只是在測試版本庫而不是主持人的存儲庫,所以返回的可觀察值將永遠不會被訂閱,所以我無法測試那個 並感謝您的緩存實施。我一直在尋找,但找不到它。我知道這樣做會有一種更加被動的方式。 – iamareebjamal

相關問題