我有一个测试,我在其中检查令牌授权的重试机制。在该测试中,我在开头返回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)
看起来很难看。
答案 0 :(得分:3)
just()
采用常量值引用,并不断向订阅者分发相同的引用。
您需要的是fromCallable
:
Observable.fromCallable(() -> accountManager.getToken())
...
每当新订户(例如重试)进入时,lambda将再次执行。