JUnit5测试HttpClientErrorException.Unauthorized场景失败求助
问题原因分析
测试失败的核心是异常类型不匹配:
- 业务方法中
catch的是HttpClientErrorException.Unauthorized(HttpClientErrorException的静态内部子类) - 但测试代码抛出的是
HttpClientErrorException父类实例,仅传入HttpStatus.UNAUTHORIZED状态码
Java的异常捕获机制中,子类类型的catch块无法捕获父类异常实例,因此业务方法里的catch逻辑根本不会触发,异常直接向上抛出,导致断言预期的GitUnauthorizedException未被抛出。
解决方案
修改测试代码,抛出HttpClientErrorException.Unauthorized子类实例,模拟真实场景下RestTemplate抛出的异常类型:
@Test void getLimitTest_UNAUTHORIZED_ERROR() { String apiUrl = GIT_API_URL + "/rate_limit"; // 替换为抛出HttpClientErrorException.Unauthorized子类 when(restTemplate.getForObject(apiUrl, RateLimitDto.class)) .thenThrow(new HttpClientErrorException.Unauthorized("401 Unauthorized")); assertThrows(GitUnauthorizedException.class, () -> { gitService.getLimit(); }); }
补充优化方案
如果想让业务方法的异常处理更健壮,也可以改为捕获父类HttpClientErrorException,再通过状态码判断是否为未授权:
public RateLimitDto getLimit() { String apiUrl = GIT_API_URL + "/rate_limit"; try { return restTemplate.getForObject(apiUrl, RateLimitDto.class); } catch (HttpClientErrorException e) { if (HttpStatus.UNAUTHORIZED.equals(e.getStatusCode())) { throw new GitUnauthorizedException("User unauthorized!"); } throw e; // 重新抛出其他HTTP客户端异常 } }
这种写法下,无论测试抛出父类还是子类异常,只要状态码为401,都会触发自定义异常,测试也能正常通过。
内容的提问来源于stack exchange,提问作者Karlz-Bandz
相关产品推荐
相关产品推荐

