考虑以下代码片段:
@Scheduled(...)
public void cleanUpDbs() {
fooRepository.deleteAll()
.retryWhen(Retry.backoff(3, Duration.ofSeconds(2)))
.doOnError(log::error)
.block();
}
和单元测试:
@Test
void cleanUp_IsRetriedWhenErrorOccurs() {
when(fooRepository.deleteAll())
.thenReturn(Mono.error(new IllegalArgumentException()))
.thenReturn(Mono.error(new IllegalArgumentException()))
.thenReturn(Mono.empty());
dbsCleanupService.cleanUp();
verify(fooRepository, times(3)).deleteAll();
}
请不要介意阻塞行为,我知道这一点,它是计划方法的一部分,每天午夜运行一次。 如果有人能解释为什么总是考虑第一个存根,而忽略第二个和第三个调用,我将不胜感激? 因此测试失败,最大重试次数耗尽,因为它始终使用相同的源(模拟中的第一个 thenReturn() ) 我怎样才能让它重新订阅/调用,以便每次重试都会进行新的调用?
考虑使用
Mono#defer
:
Mono.defer(() -> fooRepository.deleteAll())
.retryWhen(Retry.backoff(3, Duration.ofSeconds(2)))
.doOnError(log::error)
.block();