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
相关产品推荐
相关产品推荐

