android - 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() 方法的任何建议?
解决方案
根据参考文档,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()
}
推荐阅读
- firebase - Flutter firebase_database 获取孩子
- google-apps-script - WebApp 内容长度响应标头
- elasticsearch - 如何减少 Logstash 的 RAM 使用量?
- vba - 如何在 Word 宏中从 VBA 打开访问数据库
- javascript - 如何使 SVG 元素在 React 上可点击?
- git - 如何删除分支以便我的本地代码恢复到以前的状态?
- wpf - 棱镜 7:无法显示视图
- python - Selenium Python:如何等到元素完成更改文本后再使用读取值?
- javascript - 如何在 AngularJS 测试中应用动态语言环境更改?
- javascript - 无法使用 feathersjs express 应用程序提供静态文件