【问题标题】:How to write Component Test for the service class which uses returns Mono?如何为使用返回 Mono 的服务类编写组件测试?
【发布时间】:2021-10-15 06:31:08
【问题描述】:

我在 Spring Boot 中有一个使用 Spring Webflux 的基于 REST API 的应用程序。像往常一样,REST 调用流程如下所示:

RestController -> 服务 -> 另一个微服务(REST 调用)

Service 类使用WebClient 对另一个服务进行HTTP 调用并返回Mono,例如:

private Mono<SubmissionResponse> submit(Submission mySubmission)  {

  Mono<Void> 201Response = webClient
        .post()
        .uri("/submit")
        .body(Mono.just(mySubmission), Submission.class)
        .retrieve()
        .onStatus(status -> status.equals(HttpStatus.NOT_FOUND), resp -> Mono.just(new SubmissionNotFoundException("No Submission found", HttpStatus.NOT_FOUND.name())))
        .bodyToMono(Void.class);

    return 201Response.map(r -> myResponseGenerator.generateResponse(mySubmission));
}

我在组件测试期间启动了一个有线模拟服务器。测试用例代码如下:

Mono<SubmissionResponse> submissionResponse = submissionService.submit(mySubmission);
SubmissionResponse response = submissionResponse.block();

在上面的测试用例代码中,响应对象总是null

【问题讨论】:

    标签: spring-webflux spring-webclient


    【解决方案1】:

    Mono&lt;Void&gt; 永远不能发出值,只能发出完成信号。所以Mono&lt;Void&gt; 201Response不会发出数据,所以map不会被触发。

    试试这个:

    .bodyToMono(Void.class)
    .thenReturn(myResponseGenerator.generateResponse(mySubmission));
    

    这里,thenReturn 运算符将发出提供的值。

    【讨论】:

    • 感谢您的回复,成功了。我什至还添加了 StepVerifier 进行测试及其工作。再次感谢。
    • @lkatiforis 完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2017-05-19
    • 2010-10-05
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多