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?

Solutions Collecting From Web of "RxJava2 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())); }