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

