RxJava Условно вернуть Maybe из Single <String>или Maybe.empty () - PullRequest
0 голосов
/ 14 мая 2019

Я хочу, чтобы в качестве возвращаемого типа был указан Single, или в случае null может быть пустое значение.

Сначала я вызываю метод для получения логического значения:

Single<Boolean> isRemembered()

Затем, если этот метод возвращает true, вызовите этот метод:

Single<String> getRemembered()

Если isRemembered () вернет true, getRemembered () никогда не будет нулевым значением.

Вот моя попытка потока:

public Maybe<String> getRememberIfExists(){
        return sharedPreferencesRepositoryType.isRemembered()
                .flatMapMaybe(aBoolean -> {
                    if(aBoolean){
                        return sharedPreferencesRepositoryType.getRemembered()
                                .flatMapMaybe(Maybe::just);
                    }else{
                        return Maybe.empty();
                    }
                });
    }

Я написал тест для обоих случаев, когда isRemembered () возвращает true и false:

@Test
public void getRememberIfExists() {
    when(repository.getRemembered()).thenReturn(Single.just(REMEMBERED));
    when(repository.isRemembered()).thenReturn(Single.just(true));

    TestObserver<String> observer = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();
    verify(repository).getRemembered();

    observer.assertNoErrors()
            .assertComplete()
            .assertValueCount(1);

    assertEquals(REMEMBERED, observer.values().get(0));


}

@Test
public void getRememberIfExistsError(){
    when(repository.isRemembered()).thenReturn(Single.just(false));

    TestObserver<String> testObserver = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();

    testObserver.assertComplete();
    testObserver.assertEmpty();

}

Первый тест прошел успешно.Второй сбой:

java.lang.AssertionError: Completed! (latch = 0, values = 0, errors = 0, completions = 1)

at:

testObserver.assertEmpty()

Есть предложения о том, как правильно написать мой метод getRememberIfExists () выше?

1 Ответ

2 голосов
/ 14 мая 2019

Согласно справочному документу , assertEmpty

Возвращает экземпляр (singleton) Maybe, который немедленно вызывает onComplete.

Поэтому используйте «assertNoValues» вместо «assertEmpty»:

@Test
public void getRememberIfExistsError(){
    when(repository.isRemembered()).thenReturn(Single.just(false));

    TestObserver<String> testObserver = interactor.getRememberIfExists()
            .test();

    verify(repository).isRemembered();

    testObserver.assertComplete();
    testObserver.assertNoValues()

}
...