如何在 Jacoco 代码覆盖率中忽略 Lombok 的@SneakyThrows?

Posted

技术标签:

【中文标题】如何在 Jacoco 代码覆盖率中忽略 Lombok 的@SneakyThrows?【英文标题】:How to ignore @SneakyThrows of Lombok in Jacoco code coverage? 【发布时间】:2021-07-29 08:13:02 【问题描述】:

我使用 JaCOCO 来查看代码覆盖率(并为此使用 Intellij 插件)。我的代码上有@SneakyThrows of lombok。由于@SneakyThrows 只会将已检查的异常转换为未检查的异常,因此我希望它不会影响代码覆盖率。

但是,它似乎降低了代码覆盖率:

我尝试将lombok.addLombokGeneratedAnnotation = true 添加到我的lombok.config,但没有用。

感谢您的任何建议!

【问题讨论】:

问题是 - 在 jacoco 报告中看到使用 lombok 注释时未涵盖 确切 的内容相当复杂。我通常做的是“de-lombok”一切,运行测试并找出实际未覆盖的路径。然后“lombok”返回代码。有 intellij 插件。 @Eugene 我知道偷偷摸摸的 throws 生成的代码是 not 运行的。代码只是... catch(...) throw ...。当然它没有运行,因为我不会导致里面的代码抛出。但我想忽略这个未被覆盖的catch 你不能。 jacoco 查看.class 文件,该文件是在 lombok 处理器之后生成的。想一想:你确实有一条未被覆盖的路径。 @Eugene 嗯...谢谢! 【参考方案1】:

我对此的解决方案是尝试模拟objectMapper 以引发未经检查的异常(例如:RuntimeException),然后代码流将跳转到内部以捕获块(由 Lombok 生成)并且 @SneakyThrows 将被覆盖。

【讨论】:

【参考方案2】:

你不能忽略某个代码路径,jacoco 不支持它(它也不能忽略一个方法)。由于缺乏更好的术语,它的度量单位是.class 文件。由于 jacoco 会查看 .class 文件,该文件是在 lombok 处理器启动后生成的 - 你只需拥有未经测试的路径。

简单地说,jacoco 看到您的文件就像它从未有过 lombok 注释一样。所以你不能“排除”注释。我感受到了你的痛苦——我们的模块中人们强制执行了非常多的覆盖率,而这些 catch 块几乎一直都未经测试。

【讨论】:

谢谢!那么有什么方法可以解决这个问题吗?例如,除了 jacoco,还有其他工具吗? @ch271828n 例如有codecov,虽然它是商业的,afaik;我个人从未使用过它。 sonarqube 可能也有类似的东西 我知道那些工具,但它们似乎不提供这种东西。还是谢谢!

以上是关于如何在 Jacoco 代码覆盖率中忽略 Lombok 的@SneakyThrows?的主要内容,如果未能解决你的问题,请参考以下文章

Maven工程配置代码覆盖工具Jacoco

jacoco增量代码覆盖率

如何在 Java 应用程序中使用 JaCoCo 生成代码覆盖率报告?

如何验证某些排除类和jacoco插件的最小覆盖率?

如何在 Maven 测试阶段生成 jacoco 报告

单元测试——jacoco单元测试代码覆盖率检测