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

