Java 在Mockito中为retryWhen调用链接不同的返回

Java 在Mockito中为retryWhen调用链接不同的返回,java,mockito,rx-java,rx-android,Java,Mockito,Rx Java,Rx Android,我正在为Android中的RxJava观察对象创建单元测试 我希望将模拟的返回值链接起来,并在可观察对象中模拟错误/恢复值 我正在这样做: when(repository.getObservable()) .thenReturn(Observable.error(new Exception())) .thenReturn(Observable.just(driver)); 我的可观察到: return repository.getObservab

我正在为Android中的RxJava观察对象创建单元测试

我希望将模拟的返回值链接起来,并在可观察对象中模拟错误/恢复值

我正在这样做:

when(repository.getObservable())
            .thenReturn(Observable.error(new Exception()))
            .thenReturn(Observable.just(driver));
我的可观察到:

return repository.getObservable()
            .retryWhen(observale -> {
                 return observable
                        .zipWith(Observable.range(1, 3), Pair::create)
                        .flatMap(o -> {
                             if (o.second < count) {
                               return Observable.timer(1000, TimeUnit.MILLISECONDS);
                             }
                             return Observable.error(o.first);
            })))
returnrepository.getObservable()
.retryWhen(观察->{
可观测回波
.zipWith(可观察的.range(1,3),Pair::create)
.flatMap(o->{
如果(秒<计数){
返回可观察计时器(1000,时间单位为毫秒);
}
返回可观测误差(o.first);
})))
但是我只收到
Observable.error(newexception())
,甚至调用
retryWhen
方法3次以上

有人知道如何测试不同可观察对象的重新发射来测试
retryWhen
操作符吗?

retryWhen()
不会第二次调用
repository.getObservable()
。而是使用第一次返回的
observatable.error()

为了以这种方式使用
retryWhen()
,您必须返回一个
Observable
,它在第一次订阅时返回一个错误,但在后续订阅中不返回。例如,您可以执行以下操作:

Observable.defer(new Func0<Observable<String>>() {
  boolean hasBeenSubscribedTo = false;

  @Override public Observable<String> call() {
    if (!hasBeenSubscribedTo) {
      hasBeenSubscribedTo = true;
      return Observable.error(new Exception());
    }
    return Observable.just("Hello, world!");
  }
})
.retryWhen(/* ...etc... */)
Observable.defer(新函数0(){
布尔hasBeenSubscribedTo=false;
@覆盖公共可观察调用(){
如果(!hasBeenSubscribedTo){
hasBeenSubscribedTo=true;
返回Observable.error(新异常());
}
返回可见。只是(“你好,世界!”);
}
})
.retryWhen(/*…等….*/)

惊人的Daniel!我尝试使用延迟,但没有逻辑返回,很好的捕获!非常感谢。我使用
fromCallable
而不是
defer
来减少代码(不必用
可观察的
来包装结果)。还有其他解决方案吗?这个答案意味着我应该添加无用的代码,这些代码只用于测试。这篇博文也谈到了这一点(在结尾):