如何使用JUnit测试Java代码中try catch块的catch分支
测试catch代码块的触发构造方案
原测试目标代码如下:
public static String createSOAPFaultServerError(final Exception cause) { String result = null; logger.error("Creating SOAP fault:", cause); try { ... } catch (Exception e) { logger.error("Error creating SOAP fault", e); } return result; }
你需要基于try块(代码中省略的...部分)的具体业务逻辑构造异常触发条件,通用的可行方案如下:
- 构造入参异常抛出场景:如果try块内会读取传入
cause的相关属性(比如错误消息、堆栈信息、异常类名等),可以用Mock工具构造一个特殊的Exception实例,设置当调用cause.getMessage()、cause.getStackTrace()这类方法时主动抛出运行时异常,即可直接触发上层catch块。 - 模拟SOAP处理依赖故障:如果try块内用到了JAX-WS、XML序列化等SOAP相关的工具类或第三方依赖,可以主动破坏依赖的可用状态:比如用Mock工具让SOAP报文生成方法抛出
SOAPException、XMLStreamException这类处理异常,也可以替换XML处理工厂类为无效实现,触发序列化阶段的异常。 - 单元测试强制抛出异常:做单元测试时可以直接用PowerMock等工具拦截try块内部调用的方法,不管是静态方法还是实例方法,都可以设置为直接抛出任意
Exception子类的异常,不需要修改原有业务逻辑就能快速触发catch块。
触发后可以通过两个点验证catch块执行是否符合预期:一是日志框架是否正确输出了Error creating SOAP fault的错误日志及对应的异常栈,二是方法返回值是否为预期的null。
内容的提问来源于stack exchange,提问作者Sbean
相关产品推荐
相关产品推荐

