Lombok @Builder注解导致单元测试代码覆盖率为0的解决办法
解决Lombok @Builder导致IntelliJ代码覆盖率为0%的问题
问题根源
@Builder注解会自动生成一系列辅助代码:
- 静态的
builder()方法 - 内部Builder类(包含属性的链式setter方法和
build()方法) - 关联的构造逻辑
这些自动生成的代码默认会被IntelliJ的代码覆盖率工具纳入统计,但如果你的测试用例没有覆盖这些代码,就会拉低整个类的覆盖率,甚至显示为0%。
为什么lombok.config配置未生效?
你添加的lombok.addLombokGeneratedAnnotation = true配置需要满足几个前提才会生效:
- Lombok版本必须≥1.16.16(该版本开始支持自动为生成代码添加@Generated注解)
- lombok.config文件必须放在项目根目录或模块根目录(与pom.xml/gradle.build同级),否则Lombok无法读取到配置
- IntelliJ可能需要清理缓存并重启,才能识别新的配置
解决方案
方案1:通过注解让IntelliJ忽略生成代码
- 确保lombok.config文件位置正确,内容如下:
config.stopBubbling = true lombok.addLombokGeneratedAnnotation = true - 检查项目依赖的Lombok版本,确保≥1.16.16
- 重启IntelliJ并清理缓存(路径:
File -> Invalidate Caches...) - 配置IntelliJ忽略带@Generated注解的代码:
- 打开
File -> Settings -> Build, Execution, Deployment -> Coverage - 在「Annotations to exclude from coverage」列表中添加以下注解:
lombok.Generated(Lombok自身的生成注解)javax.annotation.Generated(旧版JDK的生成注解)javax.annotation.processing.Generated(JDK9+的生成注解)
- 打开
方案2:手动覆盖Builder相关代码
如果不想依赖注解忽略逻辑,可以在测试用例中显式调用Builder的所有方法,覆盖自动生成的代码:
@Test public void testClassNameDTOBuilder() { // 调用builder方法,为所有属性赋值并执行build ClassNameDTO dto = ClassNameDTO.builder() // 示例:.username("test").age(25) .build(); assertNotNull(dto); // 可额外断言属性值是否符合预期 }
这样测试会覆盖@Builder生成的所有代码,类的覆盖率就会恢复正常。
内容的提问来源于stack exchange,提问作者Dmitri Surname
相关产品推荐
相关产品推荐

