如何使用switchIfEmpty RxJava

bla*_*her 5 java android rx-java

这里的逻辑是,如果数据库中的等级为空,那么我想从API中获得它们。我有以下代码:

Observable.from(settingsRatingRepository.getRatingsFromDB())
            .toList()
            .switchIfEmpty(settingsRatingRepository.getSettingsRatingModulesFromAPI())
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);
Run Code Online (Sandbox Code Playgroud)

getRatingsFromDB()调用返回List<SettingRating>,但是API调用返回Observable<List<SettingRating>>

但是,当我对此进行单元测试时,当我从数据库调用传递空列表时,它不执行API调用。有人可以帮我解决这个问题。这是我的单元测试代码:

when(mockSettingsRatingsRepository.getRatingsFromDB()).thenReturn(Collections.emptyList());
List<SettingsRating> settingsRatings = MockContentHelper.letRepositoryReturnSettingsRatingsFromApi(mockSettingsRatingsRepository);

settingsParentalPresenter.onViewLoad(false);

verify(mockView).loadRatingLevels(settingsRatings, false);
Run Code Online (Sandbox Code Playgroud)

bla*_*her 7

正如@Kiskae提到的,这是我将一个空列表与一个空Observable混淆的事实。因此,我使用了以下内容:

public void onViewLoad(boolean hideLocks) {
    Observable.just(settingsRatingRepository.getRatingsFromDB())
            .flatMap(settingsRatings -> {
                if (settingsRatings.isEmpty()) {
                    return settingsRatingRepository.getSettingsRatingModules();
                } else {
                    return Observable.just(settingsRatings);
                }
            })
            .compose(schedulerProvider.getSchedulers())
            .subscribe(ratingsList -> {
                view.loadRatingLevels(ratingsList, hideLocks);
            }, this::handleError);
}
Run Code Online (Sandbox Code Playgroud)