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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:09:56