如何将Hibernate生成的方法排除在Jacoco覆盖率报告之外?
排除Hibernate生成方法的Jacoco代码覆盖率
方案1:直接用Jacoco规则过滤(最省心)
Jacoco本身支持通过方法/类名的匹配规则排除特定代码,完全不用修改业务代码,直接配置就行:
- Maven项目:在
jacoco-maven-plugin的配置里加排除规则,精准匹配$$_hibernate_*开头的方法:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <configuration> <excludes> <exclude>**/*$$_hibernate_*</exclude> </excludes> </configuration> </plugin>
- Gradle项目:在
jacocoTestReport任务里配置类目录的排除规则:
jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: ['**/*$$_hibernate_*']) })) } }
这种方式直接通过命名规则过滤,不需要依赖任何Hibernate生成器,上手快还靠谱。
方案2:通过字节码增强给生成方法加@Generated注解
如果你一定要用注解的方式让Jacoco排除,Hibernate Metamodel Generator本身不会自动给$$_hibernate_*这类代理方法加注解,但可以结合字节码工具实现:
- 先确保引入Hibernate Metamodel Generator依赖(Maven示例):
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.4.4.Final</version> <scope>provided</scope> </dependency>
- 使用Byte Buddy、ASM这类字节码操作库,在编译阶段对Hibernate生成的代理类做增强,给所有以
$$_hibernate_开头的方法加上javax.annotation.Generated或者jakarta.annotation.Generated注解(Jacoco会自动忽略带这个注解的方法)。 - 也可以扩展Hibernate的
EnhancementContext接口,自定义代理类生成时的逻辑,自动注入注解。不过这种方式需要写自定义扩展,复杂度高,远不如方案1省事。
总结
首推方案1,用Jacoco自带的过滤规则解决,成本低效果稳。只有在必须通过注解排除的场景下,再考虑方案2的字节码增强方案——Hibernate Metamodel Generator本身不直接提供这个功能,但可以作为基础配合字节码工具实现。
内容的提问来源于stack exchange,提问作者dhalsim2
相关产品推荐
相关产品推荐

