reactor + Mockito 存根中的重试机制

问题描述 投票:0回答:1

考虑以下代码片段:

@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() ) 我怎样才能让它重新订阅/调用,以便每次重试都会进行新的调用?

java mockito reactor
1个回答
0
投票

考虑使用

Mono#defer

Mono.defer(() -> fooRepository.deleteAll())
            .retryWhen(Retry.backoff(3, Duration.ofSeconds(2)))
            .doOnError(log::error)
            .block();
© www.soinside.com 2019 - 2024. All rights reserved.