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

SpringBoot RestTemplate JUnit5测试HttpStatusCodeException未捕获问题

问题根因

核心是单元测试的Mock逻辑不符合RestTemplate的实际异常抛出规则:

  • 生产环境调用时,下游返回4xx/5xx状态码,RestTemplate的postForEntity方法原生抛出的是HttpStatusCodeException的子类(比如400对应HttpClientErrorException.BadRequest),刚好匹配你业务代码的第一个catch分支,所以可以正确转为对应状态码的CustomException。
  • 单元测试中你直接Mock让postForEntity抛出CustomException,但CustomException本身不是HttpStatusCodeException的子类,第一个catch分支匹配失败,就会被第二个全局catch(Exception)分支捕获,包装成状态码500的CustomException返回,最终导致断言失败。
修复方案

把测试代码里的抛异常逻辑,改为抛出HttpStatusCodeException子类实例即可,修改后的测试代码如下:

when(restTemplate.postForEntity(anyString(), any(), eq(Object.class)))
        .thenThrow(HttpClientErrorException.create(HttpStatus.BAD_REQUEST, "Invalid", null, null, null));

修改后postForEntity抛出的异常会被第一个catch分支捕获,正确转为400状态的CustomException,断言即可正常通过。

内容的提问来源于stack exchange,提问作者ima.technophyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 05:15:04