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

Junit中@Test(expected)、assertThrows无法捕获异常问题求解

问题根因
  • 异常被业务代码内部吞服,未抛出到方法外层
    你在UserService.generate()方法中定义的catch块已经覆盖了RuntimeException类型,而IllegalArgumentException属于RuntimeException的子类,会被该catch块命中。当前catch逻辑仅打印了异常日志,没有重新向外抛出异常,因此异常不会传递到单元测试调用层,@Test(expected)注解无法感知到方法抛出了目标异常。你在控制台看到的异常栈信息是日志打印的内容,不是方法向外抛出的运行时异常。
  • 可选检查项:异常类拼写错误
    你贴出的测试代码中目标异常类写为IllegalArgumentExeception,正确拼写为IllegalArgumentException,如果实际代码中存在该拼写错误,也会导致异常类型匹配失败,从你给出的运行结果来看该问题不存在,可做额外校验。
解决方案

方案一:修改业务代码,捕获后重新抛出异常

如果业务流程要求异常必须向外透出,在catch块中添加重抛逻辑即可:

try {
  UrlDecoder.decode(someString); // invalid somestring here
  ...
} catch (UnsupportedEncodingException | RuntimeException e) {
  customLogger("Exception message here");
  throw e; // 新增重抛逻辑
}

修改后单元测试即可正常捕获到抛出的IllegalArgumentException。

方案二:业务不允许抛出异常时,调整单元测试逻辑

如果业务设计要求该方法不能向外抛出异常,就不需要用@Test(expected)做校验,改为验证自定义日志的输出内容是否符合预期即可,比如使用对应日志框架的测试组件抓取日志输出,判断是否打印了目标异常相关的日志。

内容的提问来源于stack exchange,提问作者user15923931

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:15:09