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

Java中WebClient的.doOnError单元测试异常转换未生效问题

WebClient异常转换失效:单元测试仍抛出原异常的解决办法

问题核心原因

你代码里用了doOnError处理异常,但doOnError只是错误发生时执行额外逻辑的副作用操作,它不会替换流中的原异常信号。原WebClientResponseException依然会沿着流传递,最终block()抛出的还是原异常,而非你自定义的InvalidRequestException。

修正业务代码

要实现异常转换,必须用onErrorMap——它的作用就是将流中的异常替换为新的异常,彻底改变错误信号:

final String resp =
    req.retrieve().bodyToMono(String.class)
        .onErrorMap(
            WebClientResponseException.class,
            err -> {
              // 这里保留你原来的处理逻辑
              return new InvalidRequestException(err.getResponseBodyAsString());
            })
        .block();

单元测试调整

如果你的InvalidRequestException需要携带状态码(对应测试里的getRawStatusCode断言),要先确保自定义异常的构造方法支持接收并保存该参数:

public class InvalidRequestException extends RuntimeException {
    private final int rawStatusCode;

    public InvalidRequestException(String message, int rawStatusCode) {
        super(message);
        this.rawStatusCode = rawStatusCode;
    }

    public int getRawStatusCode() {
        return rawStatusCode;
    }
}

对应onErrorMap里也要传递状态码:

return new InvalidRequestException(err.getResponseBodyAsString(), err.getRawStatusCode());

最后补充测试里的fail断言,确保测试能正确验证异常抛出逻辑:

try {
    String result = someServiceSpy.getResponse(requestBody);
    fail("Expected InvalidRequestException was not thrown");
} catch (InvalidRequestException e) {
    assertEquals(400, e.getRawStatusCode());
}

内容的提问来源于stack exchange,提问作者Meilan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:40:38