Java 在Mockito中为retryWhen调用链接不同的返回
我正在为Android中的RxJava观察对象创建单元测试 我希望将模拟的返回值链接起来,并在可观察对象中模拟错误/恢复值 我正在这样做: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
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
来减少代码(不必用可观察的来包装结果)。还有其他解决方案吗?这个答案意味着我应该添加无用的代码,这些代码只用于测试。这篇博文也谈到了这一点(在结尾):