如何在Sonar Cobertura中排除Java Bean变量注解的代码覆盖率统计?
解决Sonar Cobertura中排除Java Bean变量注解的代码覆盖率统计问题
我之前处理过类似的场景,通常来说字段声明和其上的注解不应该被计入可执行代码覆盖率,但可能是你的Cobertura版本、插件配置或者SonarQube的规则设置导致这些行被错误统计。下面是几种靠谱的解决方法,按推荐程度排序:
方法1:通过Cobertura插件配置忽略特定注解
这是最推荐的方案,不需要修改业务代码,只需在Maven(或Gradle)的Cobertura插件配置中添加规则,让它忽略带有@JcrProperty注解的元素:
如果你用Maven,在pom.xml的Cobertura插件里添加如下配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> <!-- 建议使用最新稳定版 --> <configuration> <instrumentation> <!-- 忽略带有指定注解的所有元素(字段、方法等) --> <ignoredAnnotations> <ignoredAnnotation>com.yourpackage.JcrProperty</ignoredAnnotation> </ignoredAnnotations> </instrumentation> </configuration> </plugin>
替换com.yourpackage.JcrProperty为你实际的@JcrProperty注解的全限定类名即可。配置后,Cobertura在字节码插桩时会自动跳过带有该注解的字段,不会统计它们的覆盖率。
方法2:在SonarQube中精准忽略注解行
如果不想调整Cobertura的配置,可以直接在SonarQube层面过滤掉这些注解行的覆盖率统计:
方式A:通过SonarQube界面配置
- 进入你的SonarQube项目,点击Settings > General Settings > Analysis Scope
- 在Coverage区域的Exclusions里,添加行匹配规则:
这个规则会匹配所有Bean类中带有**/*Bean.java:@JcrProperty*@JcrProperty的行,排除它们的覆盖率统计。
方式B:通过配置文件设置
在项目根目录的sonar-project.properties中添加:
# 排除所有带有@JcrProperty注解的行 sonar.coverage.exclusions=**/*Bean.java:@JcrProperty*
如果你的Bean类有统一的命名规则(比如后缀为Bean),这个方式非常高效。
方法3:使用Cobertura的@CoverageIgnore注解标记字段
如果允许修改业务代码,可以直接在目标字段上添加Cobertura的忽略注解,强制跳过该字段的覆盖率统计:
@JcrProperty(name = "vermittlernummer") @org.codehaus.mojo.cobertura.CoverageIgnore private String vermittlernummer;
这个方法适合字段数量不多的场景,但需要侵入业务代码,所以优先级低于前两种。
方法4:升级Cobertura版本
有些旧版本的Cobertura会错误地把字段注解行识别为可执行代码,升级到最新稳定版(比如2.7及以上)可能会自动解决这个问题,不需要额外配置。
内容的提问来源于stack exchange,提问作者Prasad Boggavarapu
相关产品推荐
相关产品推荐

