retryWhen()不调用Observable.just()中的内容

时间:2017-03-02 10:59:25

标签: unit-testing mockito rx-java kotlin observable

我有一个测试,我在其中检查令牌授权的重试机制。在该测试中,我在开头返回null作为标记,然后我返回一个有效的标记,如下所示:

whenever(accountManager.getToken())
            .thenReturn(null)
            .thenReturn("some_token") 

然后我有一个Observable:

    return Observable.just(accountManager.getToken())
            ...
            .retryWhen { retryOnAuthExceptionWithBackoff(it) }

它应该获取令牌,将其发送到某处,等待响应,然后响应错误,再次重试整个过程直到成功。

问题是当retryWhen()启动时,源observable不再被调用,只是它的初始值立即返回。

另一方面,确实工作:

    return Observable.just(null)
            .map{ accountManager.getToken() }
            ...
            .retryWhen { retryOnAuthExceptionWithBackoff(it) }

是设计还是错误?如果它是设计的,那么写一个优雅的方式,因为Observable.just(null)看起来很难看。

1 个答案:

答案 0 :(得分:3)

just()采用常量值引用,并不断向订阅者分发相同的引用。

您需要的是fromCallable

Observable.fromCallable(() -> accountManager.getToken())
...

每当新订户(例如重试)进入时,lambda将再次执行。