0
我有一个测试,其中我检查令牌授权的重试机制。内部的测试,我返回null作为在开始令牌,然后我返回一个有效的令牌,就像这样:retryWhen()不会调用里面的内容Observable.just()
whenever(accountManager.getToken())
.thenReturn(null)
.thenReturn("some_token")
然后,我有一个可观察:
return Observable.just(accountManager.getToken())
...
.retryWhen { retryOnAuthExceptionWithBackoff(it) }
它应该得到的令牌,将其发送某处等待响应,然后响应错误,重试整个过程直到成功。
问题是,当retryWhen()
开始时,源observable不再被调用,只是其初始值立即返回。
在另一方面,这确实工作:
return Observable.just(null)
.map{ accountManager.getToken() }
...
.retryWhen { retryOnAuthExceptionWithBackoff(it) }
设计是它还是一个错误吗?如果是按照设计进行的,那么编写这个的优雅方式是什么,因为Observable.just(null)
看起来就很难看。
让我重新排列您的代码: Object x = accountManager.getToken(); System.out.println(x); System.out.println(x); // < - 应该打印一个非空值吗? Observable.just(x).subscribe(System.out :: println); – akarnokd
不,在你的例子中,你只调用了'getToken()'一次。如果你写了'Object x = accountManager.getToken();''Object y = accountManager.getToken();'那么在我的例子中'y'不会为空。重点是,从'accountManager.getToken()'第二次读取它已经有令牌。如果该函数在'Observable.just'内解析了两次,它将返回不同的值(就像我在第二个例子中那样)。 –
你觉得just()调用你的getToken函数吗?错误。 Just()需要一个常量值引用,并不断向用户发布**相同的**引用。 – akarnokd