Rx java 使用RxJava的操作序列

Rx java 使用RxJava的操作序列,rx-java,rx-java2,Rx Java,Rx Java2,我想做一系列的操作。下一个只有在前一个成功时才能执行。为了提高我的理解力,我决定尝试用RxJava实现它 操作顺序如下: 登录 存储登录结果 使用登录结果检索用户信息 存储用户信息 为此,我使用以下方法: 公共接口登录还原{ 仅有一个的login@NonNull最后全权证书; 完全的storeLoginResult@NonNull最终登录回复实体登录功能; } 及 公共接口用户设置存储{ 仅有一个的retrieveUserInfo@NonNull最终字符串电子邮件,最终字符串accessToke

我想做一系列的操作。下一个只有在前一个成功时才能执行。为了提高我的理解力,我决定尝试用RxJava实现它

操作顺序如下:

登录 存储登录结果 使用登录结果检索用户信息 存储用户信息 为此,我使用以下方法:

公共接口登录还原{ 仅有一个的login@NonNull最后全权证书; 完全的storeLoginResult@NonNull最终登录回复实体登录功能; } 及

公共接口用户设置存储{ 仅有一个的retrieveUserInfo@NonNull最终字符串电子邮件,最终字符串accessToken; 完全的storeUserInfo@NonNull最终用户信息实体用户信息实体; } 以及登录用例:

公共完全表execute@NonNull最后全权证书{ return loginRepository.logincredentials .flatMaploginEntity->loginRepository.storeLoginResultloginEntity .andtenUserSettingsRepository.retrieveUserInfocredentials.getEmail, loginEntity.getAccessToken .flatMapCompletableuserSettingsRepository::storeUserInfo 。并保存已标记。执行; } 为了测试这一点,我在Kotlin中创建了单元测试。全部通过,除了这两个:

@Test
fun `when storing login result failed, don't retrieve user info`() {
    val exception = Exception()
    whenever(loginRepository.login(any())).thenReturn(Single.just(loginResponseEntity()))
    whenever(loginRepository.storeLoginResult(any())).thenReturn(Completable.error(exception))
    whenever(saveIsAlreadyLogged.execute()).thenReturn(Completable.complete())

    val test = login.execute(credentials()).test()

    verify(userSettingsRepository, never()).retrieveUserInfo(anyString(), anyString())
}
错误:

org.mockito.exceptions.verification.NeverWantedButInvoked: 
userSettingsRepository.retrieveUserInfo(
    <any string>,
    <any string>
);
错误:

java.lang.AssertionError: Error not present (latch = 0, values = 0, errors = 1, completions = 0)
你知道我做错了什么吗?
您有关于如何改进我的代码的提示吗?请给出一个清晰的解释,因为我还在学习。

对于第一种情况,问题在于:

.andThen(
    userSettingsRepository.retrieveUserInfo(
        credentials.getEmail(),
        loginEntity.getAccessToken()
    )
)
请注意,对retrieveUserInfo的调用是完成的,而不管之前发生了什么。换句话说:这是在设置流时执行的,而不是在运行流时执行的。您可能希望使用到内部,然后匹配您的期望

对于第二个问题,您可以看到发生了一个错误:

java.lang.AssertionError:错误不存在闩锁=0,值=0,错误=1,完成=0

errors=1表明了这一点,您需要查看完整消息,以了解@akarnokd指出的错误是什么

您始终执行userSettingsRepository.retrieveUserInfo方法,即使返回的单曲由于错误而未订阅。测试中可能会有不同的错误,应该与断言错误一起打印
.andThen(
    userSettingsRepository.retrieveUserInfo(
        credentials.getEmail(),
        loginEntity.getAccessToken()
    )
)