我有一个测试,我在该测试中检查了对令牌授权的重试机制。在该测试中,我在开始时将null返回为null,然后返回有效的令牌,这样:
whenever(accountManager.getToken())
.thenReturn(null)
.thenReturn("some_token")
然后我有一个可观察的:
return Observable.just(accountManager.getToken())
...
.retryWhen { retryOnAuthExceptionWithBackoff(it) }
它应该得到令牌,将其发送到某个地方,等待响应,然后响应是错误的,再次重试直到成功。
。问题是,当retryWhen()
启动时,请观察到源可观察到的源,只是立即返回其初始值。
另一方面,此做工作:
return Observable.just(null)
.map{ accountManager.getToken() }
...
.retryWhen { retryOnAuthExceptionWithBackoff(it) }
是设计还是错误?如果是设计,那将是一种优雅的写作方式,因为Observable.just(null)
看起来很丑。
just()
进行恒定值参考,并不断向订户分发相同的参考。
您需要的是fromCallable
:
Observable.fromCallable(() -> accountManager.getToken())
...
每当新的订户(例如重试)进来时,lambda再次执行。