非生成代码如何排除特定方法在Jacoco扫描范围之外?
排除特定方法在Jacoco扫描范围外的可行方案
有几种实用的方法可以精准实现这个需求,不用改动核心业务逻辑:
给目标方法添加@Generated注解
Jacoco默认会跳过带有javax.annotation.Generated(Java 8及更早版本)或jakarta.annotation.Generated(Java 9+)注解的方法,不管代码是否为自动生成,你可以手动给要排除的方法加上这个注解:import javax.annotation.Generated; public class YourService { // 该方法会被Jacoco忽略扫描 @Generated("手动标记排除Jacoco") public void skipThisMethod() { // 方法逻辑 } // 正常参与Jacoco扫描的方法 public void processBusinessLogic() { // 业务逻辑代码 } }如果项目中没有这个注解的依赖,直接引入
javax.annotation-api或jakarta.annotation-api即可。自定义注解+Jacoco配置识别
不想用官方注解的话,可以自己定义专属注解,再配置Jacoco忽略带该注解的方法:- 先编写自定义注解:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ExcludeFromJacoco { } - 在构建工具中配置Jacoco识别并忽略该注解:
Maven的pom.xml配置示例:
Gradle的build.gradle配置示例:<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.11</version> <configuration> <excludes> <exclude>**/*ExcludeFromJacoco*</exclude> </excludes> </configuration> <!-- 其他执行环节配置... --> </plugin>jacocoTestReport { excludes = ['**/*ExcludeFromJacoco*'] } jacocoTestCoverageVerification { violationRules { rule { excludes = ['**/*ExcludeFromJacoco*'] } } } - 给目标方法添加自定义注解:
public class YourService { @ExcludeFromJacoco public void skipThisMethod() { // 方法逻辑 } }
- 先编写自定义注解:
直接通过配置指定方法全限定名排除
不想修改代码的话,直接在Jacoco配置中写死要排除的方法全路径,适合临时排除场景:
Maven配置示例:<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.11</version> <configuration> <excludes> <!-- 格式:包名.类名.方法名(参数类型) --> <exclude>**/YourService.skipThisMethod()</exclude> <!-- 带参数的方法需明确参数类型,比如String参数:**/YourService.skipThisMethod(java.lang.String) --> </excludes> </configuration> </plugin>Gradle配置示例:
jacocoTestReport { excludes = [ '**/YourService.skipThisMethod()', '**/YourService.skipThisMethod(int)' ] }注意:参数类型要写全限定名,避免匹配错误。
内容的提问来源于stack exchange,提问作者Ajay Sabarish
相关产品推荐
相关产品推荐

