You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为返回Mono<Void>的Web Client编写集成测试并使用StepVerifier验证

问题解决:测试返回Mono的WebClient方法

首先要指出你原代码里的一个关键错误:process方法里的.subscribe()是多余且错误的——subscribe()会触发订阅并返回Disposable,但你的方法声明返回Mono<Void>,这会直接导致编译错误。正确的做法是去掉这个.subscribe(),让方法返回WebClient调用生成的Mono,由调用方决定何时订阅:

public Mono<Void> process(InputBody body) {
  return webClient
        .post()
        .uri("/submit")
        .body(Mono.just(body), InputBody.class)
        .retrieve()
        .bodyToMono(Void.class);
}

接下来针对Mono<Void>的测试逻辑:因为Void类型的Mono不会发射任何数据,只会触发onComplete(成功)或onError(失败)信号,所以用StepVerifier时只需要验证这两种状态即可。

补全测试代码的两种场景

场景1:直接测试process方法的返回结果

这种方式是测试你的业务方法,不需要直接调用WebClient的exchange():

@Test
void testProcessSuccess() {
    // 构造测试用的请求体
    InputBody testBody = new InputBody();
    // 假设你的服务实例已经初始化,webClient指向测试环境/Mock服务
    
    Mono<Void> processResult = yourServiceInstance.process(testBody);
    
    StepVerifier.create(processResult)
            // 验证Mono正常完成(无数据发射,仅成功结束)
            .verifyComplete();
}

// 测试错误场景
@Test
void testProcessFailure() {
    InputBody testBody = new InputBody();
    
    Mono<Void> processResult = yourServiceInstance.process(testBody);
    
    StepVerifier.create(processResult)
            // 验证触发WebClient的响应异常(比如后端返回4xx/5xx)
            .expectError(WebClientResponseException.class)
            .verify();
}

场景2:直接调用WebClient的exchange()测试接口

如果你想跳过业务方法,直接测试后端接口,补全代码如下:

@Test
void testSubmitEndpoint() {
    InputBody testBody = new InputBody();
    WebClient testWebClient = WebClient.create("http://your-test-server:port");
    
    Mono<Void> responseMono = testWebClient
            .post()
            .uri("/submit")
            .body(Mono.just(testBody), InputBody.class)
            .exchange()
            // 先验证响应状态码是否符合预期
            .flatMap(clientResponse -> {
                // 示例:验证返回200 OK
                Assertions.assertEquals(HttpStatus.OK, clientResponse.statusCode());
                // 将响应转换为Mono<Void>供StepVerifier验证
                return clientResponse.bodyToMono(Void.class);
            });
    
    StepVerifier.create(responseMono)
            .verifyComplete();
}

内容的提问来源于stack exchange,提问作者D.Anush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:06:27