2017-03-02 30 views
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)看起来就很难看。

+0

让我重新排列您的代码: Object x = accountManager.getToken(); System.out.println(x); System.out.println(x); // < - 应该打印一个非空值吗? Observable.just(x).subscribe(System.out :: println); – akarnokd

+0

不,在你的例子中,你只调用了'getToken()'一次。如果你写了'Object x = accountManager.getToken();''Object y = accountManager.getToken();'那么在我的例子中'y'不会为空。重点是,从'accountManager.getToken()'第二次读取它已经有令牌。如果该函数在'Observable.just'内解析了两次,它将返回不同的值(就像我在第二个例子中那样)。 –

+0

你觉得just()调用你的getToken函数吗?错误。 Just()需要一个常量值引用,并不断向用户发布**相同的**引用。 – akarnokd

回答

3

just()需要一个恒定值的参考,并不断给用户提供相同的参考。

你需要的是fromCallable

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

每当一个新的用户(如重试)到来时,拉姆达再次执行。