JUnit中样板代码类覆盖率为0的原因及100%实现方案
样板代码类覆盖率问题解答
背景说明
我们通过IntelliJ的「Run 'Tests in Project' with Coverage」功能查看代码覆盖率,当前项目引入SonarQube后,其质量门要求覆盖率达80%,但因大量样板代码存在,现有覆盖率仅维持在70%-75%。我们优先采用纯技术方式提升覆盖率,而非降低SonarQube质量门标准。
典型示例
- 示例一:
ResultData类仅包含public List<String> data字段,对应测试类已编写测试用例,但JUnit5/IntelliJ显示类覆盖率0%,方法与行覆盖率均为100%。 - 示例二:
InfoRequest类包含带校验注解的public String code字段,对应测试类已编写校验测试用例,但同样出现类覆盖率0%,方法与行覆盖率100%的情况。
1. 类覆盖率为0的原因
类覆盖率的统计核心是是否触发了类的构造方法执行:
- 对于仅含public字段的简单类,Java编译器会自动生成一个无参构造方法,但这个默认构造方法不会显式出现在代码中。
- 如果测试用例没有直接通过
new关键字创建类实例,或者实例是通过序列化/反射框架(如Jackson)绕过构造方法创建的,那么这个默认构造方法从未被执行,覆盖率工具就会判定类未被覆盖,显示类覆盖率0%。 - 哪怕你测试了字段的取值、校验注解,只要构造方法没被触发,类覆盖率就不会被统计。
2. 提升类覆盖率至100%的方案
针对这类样板类,可采用以下纯技术手段:
- 显式创建类实例:在测试用例中添加一行代码直接创建类对象,比如:
只需触发构造方法执行即可,无需额外操作。// 针对ResultData的测试代码片段 @Test void testResultDataClassCoverage() { new ResultData(); } - 手动声明构造方法:在样板类中显式添加无参构造方法,再在测试中调用它,让逻辑更清晰:
// ResultData类修改后 public class ResultData { public List<String> data; // 显式声明无参构造方法 public ResultData() {} } - 确保校验场景触发构造方法:如果是校验注解的测试(比如示例二),要保证测试过程是创建真实类实例并赋值,而非仅校验注解元数据。例如通过Spring Validation校验时,传入真实的
InfoRequest实例,而非仅解析注解。
内容的提问来源于stack exchange,提问作者d.braun1991
相关产品推荐
相关产品推荐

