RxJava 有条件地 return 可能来自 Single<String> 或 Maybe.empty()
RxJava Conditionally return Maybe from Single<String> or Maybe.empty()
我想要一个 Single 作为 return 类型,或者如果是 null,可能是一个空的。
首先,我调用一个方法来获取一个布尔值:
Single<Boolean> isRemembered()
然后,如果此方法return为真,则调用此方法:
Single<String> getRemembered()
如果 isRemembered() return为真,则 getRemembered() 永远不会为空值。
这是我在直播中的尝试:
public Maybe<String> getRememberIfExists(){
return sharedPreferencesRepositoryType.isRemembered()
.flatMapMaybe(aBoolean -> {
if(aBoolean){
return sharedPreferencesRepositoryType.getRemembered()
.flatMapMaybe(Maybe::just);
}else{
return Maybe.empty();
}
});
}
我为 isRemembered() returns 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() 方法有什么建议吗?
根据 reference doc,assertEmpty
Returns a (singleton) Maybe instance that calls onComplete immediately.
所以使用 "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()
}
我想要一个 Single 作为 return 类型,或者如果是 null,可能是一个空的。
首先,我调用一个方法来获取一个布尔值:
Single<Boolean> isRemembered()
然后,如果此方法return为真,则调用此方法:
Single<String> getRemembered()
如果 isRemembered() return为真,则 getRemembered() 永远不会为空值。
这是我在直播中的尝试:
public Maybe<String> getRememberIfExists(){
return sharedPreferencesRepositoryType.isRemembered()
.flatMapMaybe(aBoolean -> {
if(aBoolean){
return sharedPreferencesRepositoryType.getRemembered()
.flatMapMaybe(Maybe::just);
}else{
return Maybe.empty();
}
});
}
我为 isRemembered() returns 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() 方法有什么建议吗?
根据 reference doc,assertEmpty
Returns a (singleton) Maybe instance that calls onComplete immediately.
所以使用 "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()
}