3

在单元测试重试期间,模拟的响应似乎被缓存了,或者很可能我做错了什么。

我正在尝试请求某些内容,如果发生错误,则延迟 1 秒重试两次。

  public Mono<Object> someMethod(String someParam) {
    return someInjectedService.doSomething(someParam)
        .doOnError(ex -> System.out.println(ex + ": " + System.currentTimeMillis()))
        .retryWhen(Retry.fixedDelay(2, Duration.ofSeconds(1)).filter(ex -> ex instanceof SomeCustomException))
        .doOnSuccess(result -> doSomethingOnSuccess(result));
  }

我的测试:

  @Test
  void testshouldRequestThrice_whenErrorOccurs() {
    // Given
    String someParam = "testParam";
    when(someInjectedService.doSomething(someParam))
        .thenReturn(Mono.error(new SomeCustomException("SomeCustomException"))) // 1st response
        .thenReturn(Mono.error(new SomeCustomException("SomeCustomException"))) // 2nd response
        .thenReturn(Mono.just("SomeValidResponse")); // 3rd valid response

    // When
    var result = testService.someMethod(someParam).block();

    // Then
    // Initial request, followed by two retries
    verify(someInjectedService, times(3)).doSomething(someParam);
  }

someInjectedService是一个模拟。我的计划是两次返回异常,并在第三次请求时返回有效响应。但我得到的是:

org.mockito.exceptions.verification.TooFewActualInvocations: someInjectedService.doSomething("testParam");

想要 3 次:-> 在 shouldRequestThrice_whenErrorOccurs(test.java:138)

但是是1次:

虽然我确实看到了 3 个.doOnError(ex -> System.out.println(ex + ": " + System.currentTimeMillis()))块打印,但我觉得实际请求只发送一次。

先感谢您,

4

1 回答 1

1

someInjectedService.doSomething(...)确实在技术上只会被调用一次。

您可以Mono.defer(() -> someInjectedService.doSomething(someParam))改用,以确保再次有效调用该方法,这应该使您的测试通过。

于 2022-01-19T15:18:58.247 回答