Intereting Posts
Котлин коанс не работает? Я сошел с ума? Преобразование массива ArrayMap в ArrayList – Kotlin Ошибка в печатном простом номере с использованием функций высокого порядка в котлине Отметить неиспользованные параметры в Котлине Смарт-литье в «Тип» невозможно, потому что «переменная» является изменчивым свойством, которое к этому моменту могло быть изменено Могут ли `SendChannel.offer`,` CompletableDeferred.complete` и подобные быть вызваны внешними сопрограммами? Калькулятор не работает Как использовать функцию «val ()» в Котлине? / расширить внешние классы JS Как написать статический инициализатор уровня пакета в Котлине? Стоимость переключения потоков в RxJava и операции копирования класса данных Kotlin Сканер Bluetooth Low Energy работает нормально, но не находит никаких устройств Kotlin: Как получить доступ к методам get и setValue для делегата? В Котлине, как мне интегрировать обещание Завета с ответами Elasticearch async? Видимость конструктора ограничена файлом Должен ли я использовать демо-код ARCore или написать его самостоятельно?

RxJava2 switchIfEmpty и проверка выполнения

так что .. представьте, что у меня есть метод, подобный этому:

LocalDatabase:

public Observable<PoiObject> getPoiObject() { return Observable.defer { PoiObject object = poiDao.getPoiObject(); if(object == null) { return Observable.empty(); } else { return Observable.just(object); } } } 

теперь у меня есть другой способ где-то еще:

Обслуживание:

 public Observable<PoiObject> getPoiObject() { return localDatabase.getPoiObject() } public Observable<PoiObject> getItFromWeb() { return restService.getObject() } 

если я попытаюсь связать вызов службы :: getPoiObject с вызовом Rx следующим образом:

USECASE:

 public Observable<SomeVM> getObject() { return service.getPoiObject() .switchIfEmpty(service.getItFromWeb()) } 

Затем выполняется следующее единичное тестирование:

 @Test public void test_getObject() { Service service = mock() when(service.getPoiObject()).thenReturn(any()); Observable<SomeVM> observable = usecase.getObject(); verify(service).getPoiObject(); verify(service, times(0)).getItFromWeb(); } , @Test public void test_getObject() { Service service = mock() when(service.getPoiObject()).thenReturn(any()); Observable<SomeVM> observable = usecase.getObject(); verify(service).getPoiObject(); verify(service, times(0)).getItFromWeb(); } 

Почему бы getItFromWeb () выполнить, когда ясно, предыдущий вызов не пуст (объект возвращается из вызова service.getPoiObject ()). Есть ли какая-либо другая стратегия для тестирования switchIfEmpty?

Открытие скобки не волшебным образом приводит к тому, что код / ​​переменная за ее пределами инициализируется ленивым способом. То, что вы написали, следующее:

 public Observable<SomeVM> getObject() { Observable o1 = service.getPoiObject(); Observable o2 = service.getItFromWeb(); // <------------------- Observable o3 = o1.switchIfEmpty(o2); return o3; } 

Вы уже выполнили разумную работу в getPoiObject() , отложив выполнение, которое вы также должны применить в getObject() :

 public Observable getObject() { return service.getPoiObject() .switchIfEmpty(Observable.defer(() -> getItFromWeb())); }