我如何进行单元测试RetryWhen,
public Mono<List<Transaction>> get(String id) {
return class
.get(id).log()
.retryWhen(throwableFlux -> throwableFlux)
.zipWith(Flux.range(min, max + 1), (error, retry) -> new RetryException(error, retry))
.flatMap(retryException -> {
if(retryException.getRetries() == max + 1) {
throw Exceptions.propagate(retryException.getThrowable());
} else if (isClientException(retryException.getThrowable())){
return Flux.empty();
}
return Mono.delay(Duration.ofMinutes( new Double(multiplier * retryException.getRetries()).longValue()));
}));
}
如何使用StepVerifier测试此方法?
实现重试逻辑的另一种方法,
throwableFlux.takeWhile(throwable -> !isClientException(throwable))
.flatMap(e -> {
if(count.get() >= max + 1) {
throw Exceptions.propagate(e);
}
LOG.info("Retrying in..");
return Mono.delay(Duration.ofMinutes(new Double(multiplier * count.getAndAdd(1)).longValue()));
});
答案 0 :(得分:0)
您的意思是测试通过RetryHelper
申请的retryWhen
吗?
您当然可以使用StepVerifier
来测试这样的重试,包含序列,是的。您还可以在AtomicLong
之前使用与doOnSubscribe
耦合的retryWhen
来检查(重新)订阅的数量(它将帮助断言对正在重试的源的订阅数量) )。
请注意,我们刚刚为retryWhen
和repeatWhen
添加了这样的构建器实用程序,但是在reactor-extra
project(目前在3.1.0.BUILD-SNAPSHOT中)
答案 1 :(得分:0)
这就是我能够测试此代码的方式。
FirstStep.expectSubscription().expectNoEvent(java.time.Duration.ofMinutes(1)).expectNoEvent(Duration.ofMinutes(3)).verifyError()
我们可以使用上面的thenAwait(Duration.ofDays(1)),但是 expectNoEvent的好处是保证什么都不会发生 它之前应该有。
http://projectreactor.io/docs/core/snapshot/reference/docs/index.html#error.handling