首页 > 解决方案 > RxJava 有条件地从 Single 中返回 Maybe或 Maybe.empty()

问题描述

我希望将 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)

在:

testObserver.assertEmpty()

关于如何正确编写上面的 getRememberIfExists() 方法的任何建议?

标签: androidrx-javarx-java2

解决方案


根据参考文档assertEmpty

返回一个立即调用 onComplete 的(单例)Maybe 实例。

所以使用“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()

}

推荐阅读