如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章