gpt4 book ai didi

rx-java - 如何测试 Spring WebClient 何时重试?

转载 作者:行者123 更新时间:2023-12-03 23:50:58 28 4
gpt4 key购买 nike

我需要实现以下行为:

  • 发出 REST 发布请求
  • 如果响应返回状态 429 Too many requests , 最多重试 3 次,延迟 1 秒
  • 如果第三次重试失败或发生任何其他错误,请记录并写入数据库
  • 如果请求成功(http status 200),记录一些信息

  • 我想为此目的使用 Spring WebClient 并想出了以下代码:
    Mono<ClientResponse> response = webClient.post()
    .uri(URI.create("/myuri"))
    .body(BodyInserters.fromObject(request))
    .retrieve()
    .onStatus(httpStatus -> httpStatus.equals(HttpStatus.TOO_MANY_REQUESTS),
    response -> Mono.error(new TooManyRequestsException("System is overloaded")))
    .bodyToMono(ClientResponse.class)
    .retryWhen(Retry.anyOf(TooManyRequestsException.class)
    .fixedBackoff(Duration.ofSeconds(1)).retryMax(3))
    .doOnError(throwable -> saveToDB(some_id, throwable))
    .subscribe(response -> logResponse(some_id, response));

    现在我想测试重试机制和错误处理是否按我的预期工作。也许我可以使用 StepVerifier为此目的,但我无法弄清楚如何在我的情况下使用它。有什么有用的提示吗?

    最佳答案

    我认为您可以使用模拟 Web 服务器对此进行测试,例如MockWebServer .

    @Test
    public void testReactiveWebClient() throws IOException
    {
    MockWebServer mockWebServer = new MockWebServer();

    String expectedResponse = "expect that it works";
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(200)
    .setBody(expectedResponse));

    mockWebServer.start();

    HttpUrl url = mockWebServer.url("/mvuri");
    WebClient webClient = WebClient.create();

    Mono<String> responseMono = webClient.post()
    .uri(url.uri())
    .body(BodyInserters.fromObject("myRequest"))
    .retrieve()
    .onStatus(
    httpStatus -> httpStatus.equals(HttpStatus.TOO_MANY_REQUESTS),
    response -> Mono.error(new TestStuff.TooManyRequestsException("System is overloaded")))
    .bodyToMono(String.class)
    .retryWhen(Retry.anyOf(TestStuff.TooManyRequestsException.class)
    .fixedBackoff(Duration.ofSeconds(1)).retryMax(3));

    StepVerifier.create(responseMono)
    .expectNext(expectedResponse)
    .expectComplete().verify();

    mockWebServer.shutdown();
    }

    如果您排队另一个 MockResponse带有状态码 429 ,验证将失败,与例如相同错误代码 500 .

    关于rx-java - 如何测试 Spring WebClient 何时重试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959242/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com