Java 单元测试怎么测试异常分支的代码覆盖率

小杰君_5623

小杰君_5623

2026-09-22

665人浏览

原创

jacoco统计异常分支覆盖需测试真实抛出并执行对应路径代码,包括catch、finally及异常前校验逻辑;空catch、default分支、lombok生成代码等易误红,须通过assertthrows+副作用验证或分路径测试确保覆盖。

java 单元测试怎么测试异常分支的代码覆盖率

Java 单元测试要真正覆盖异常分支,不能只靠“代码执行了”就算数——JaCoCo 统计的是字节码执行路径,而异常分支是否被覆盖,取决于测试是否实际抛出并捕获了对应异常,且该异常路径上的代码行被 JVM 执行到。

异常分支被覆盖的关键条件

JaCoCo 将 catch 块、finally 中的语句、以及抛出异常前的校验逻辑(如 if (obj == null) throw new NullPointerException())都视为独立可覆盖的分支。要让这些变绿,必须满足:

  • 测试触发了异常产生的前置条件(例如传 null、负数、空集合、越界索引等)
  • 异常确实被抛出(未被意外吞掉或提前 return)
  • 如果用了 try-catch,则 catch 块内的代码必须执行;若没 catch,则调用栈需完整展开至测试方法外(此时 JaCoCo 仍能标记抛出点和上层处理逻辑)
  • finally 块无论是否异常都会执行,但 JaCoCo 要求它“被运行到”,所以即使正常流程也要进一次,异常流程再进一次,才算双路径覆盖

JUnit 5 正确写法:assertThrows + 验证行为

仅用 assertThrows 只能证明异常发生了,但无法确保 catch 或清理逻辑被执行。推荐组合验证:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • assertThrows 确认异常类型和消息
  • catch 块中添加可观察副作用(如设标志位、记录日志、修改状态),再在测试中检查该副作用
  • 对含 finally 的方法,分别写两个测试:一个走正常流,一个走异常流,确保 finally 内每行都被执行

示例:

@Test
void shouldThrowWhenIdIsNull() {
    // 触发空指针校验逻辑(可能在方法开头)
    IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> service.process(null));
    assertEquals("id must not be null", ex.getMessage());
}

@Test
void shouldRollbackAndLogOnFailure() {
    // 模拟底层服务抛异常
    when(repo.save(any())).thenThrow(new RuntimeException("DB fail"));

    String result = service.processWithCleanup("valid-id"); // 方法内有 try-catch-finally

    // 验证 catch 中的日志/回滚行为(如通过 Mockito verify)
    verify(logger).error(eq("Process failed"), any(RuntimeException.class));
    verify(repo).rollback(); // 假设有 rollback 方法被调用
}

JaCoCo 对异常相关结构的常见“误红”与应对

以下情况显示为未覆盖,并非测试遗漏,而是 JaCoCo 的统计机制限制:

  • 空的 catch:即使逻辑上一定会进,JaCoCo 仍要求该块至少执行一次(需真实触发异常)
  • default 分支在 switch:即使所有 case 都测了,default 行仍标红,除非显式构造进入 default 的输入
  • Lombok 生成的空构造/Getter:字节码存在但无源码映射,JaCoCo 跳过,建议在插件配置中 <excludes></excludes> 过滤 **/Lombok*
  • 编译器插入的桥接方法或 lambda 匿名类:JaCoCo 8.7+ 已较好支持,旧版本建议升级

验证异常覆盖率是否真实生效

别只看 HTML 报告里“branch coverage 85%”——重点检查报告中标红的异常相关行:

  • 打开 target/site/jacoco/index.html → 找到被测方法 → 查看每行右侧的菱形图标
  • 红色菱形表示该分支(如 if 的 false 路径、catch 块)完全未执行
  • 点击红色行,看 JaCoCo 是否提示 “0 of 2 branches covered” —— 这说明有两个分支(true/false 或 try/catch),目前只走了1个
  • 补一个触发异常的测试后,重新运行 mvn clean test jacoco:report,刷新页面确认变绿

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

8777

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5982

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5372

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

964

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

808

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1156

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2329

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19671

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1055

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习