如何在Gradle+Jacoco中排除equals和hashCode方法的测试覆盖率统计?
解决Gradle Jacoco排除equals/hashCode方法的覆盖率统计问题
嘿,这事儿我熟!要把equals和hashCode从Jacoco的覆盖率报告里排除掉,其实只需要在Gradle配置里给Jacoco的测试报告任务加个排除规则就行,分两种Gradle DSL写法给你参考:
Groovy DSL 配置
在你的build.gradle里添加下面的配置:
jacocoTestReport { classDirectories.setFrom( sourceSets.main.output.asFileTree.matching { exclude { file -> def content = file.text file.name.endsWith('.class') && (content.contains('public boolean equals(Object)') || content.contains('public int hashCode()')) } } ) }
如果需要更灵活的处理(比如配合其他排除规则),也可以用afterEvaluate的写法:
jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it) { exclude { details -> details.file.name.endsWith('.class') && (details.file.text.contains('public boolean equals(java.lang.Object)') || details.file.text.contains('public int hashCode()')) } } })) } }
Kotlin DSL 配置
如果你的项目用的是Kotlin DSL(build.gradle.kts),可以这么写:
tasks.jacocoTestReport { classDirectories.setFrom( sourceSets.main.get().output.asFileTree.matching { exclude { file -> val content = file.readText() file.name.endsWith(".class") && (content.contains("public boolean equals(Object)") || content.contains("public int hashCode()")) } } ) }
精准排除特定类的方法
如果你只想排除特定类(比如所有实体类*Entity.class)里的equals和hashCode,可以把匹配规则改得更精准:
// Groovy示例 exclude { file -> file.name.endsWith('Entity.class') && (file.text.contains('public boolean equals(java.lang.Object)') || file.text.contains('public int hashCode()')) }
原理就是通过扫描编译后的class文件,匹配equals和hashCode的标准方法签名,把包含这些方法的类(或对应方法的统计项)从覆盖率统计范围内排除。这样就算你已经为这两个方法写了测试用例,报告里也不会统计它们的覆盖率啦。
内容的提问来源于stack exchange,提问作者varun
相关产品推荐
相关产品推荐

