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