【发布时间】:2020-04-20 02:23:26
【问题描述】:
我有一个带有单个静态方法的 Groovy 类:
class ResponseUtil {
static String FormatBigDecimalForUI (BigDecimal value){
(value == null || value <= 0) ? '' : roundHalfEven(value)
}
}
它有一个或几个测试用例:
@Test
void shouldFormatValidValue () {
assert '1.8' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(1.7992311))
assert '0.9' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.872342))
}
@Test
void shouldFormatMissingValue () {
assert '' == ResponseUtil.FormatBigDecimalForUI(null)
}
@Test
void shouldFormatInvalidValue () {
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0))
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.0))
assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(-1.0))
}
这导致根据 Sonar/JaCoCo 覆盖6/12 分支:
所以我将代码更改为更...详细。我不认为原始代码“太聪明”或类似的东西,但我让它更加明确和清晰。所以,这里是:
static String FormatBigDecimalForUI (BigDecimal value) {
if (value == null) {
''
} else if (value <= 0) {
''
} else {
roundHalfEven(value)
}
}
现在,在没有改变任何其他内容的情况下,Sonar/JaCoCo 报告它已被完全覆盖:
为什么会这样?
【问题讨论】:
-
我猜这是 Sonar/JaCoCo 中的一个错误,因为据我所知,这两种方法都会产生非常相似的字节码......
-
我在 Cobertura 下运行了相同的“代码覆盖率如何”,它产生了完全相同的结果。在单行上进行了一半测试,在扩展版本上进行了全面测试。那是……关于。
-
我已经发布了两个生成的字节码here,它们在我看来都很好(但显然多行代码调用
areturn比单行版本更多)...有可能有人在 Groovy 用户邮件列表中遇到过这个问题(并找到了解决方法)......我会尝试关闭电子邮件,看看是否有人以前看过这个? -
抱歉挖掘了一个老问题,但我想知道您是如何一起使用 Groovy、Jacoco 和 Sonar 的。这是我见过的关于这种组合的唯一参考。
-
我认为我们从未真正最终使用 JaCoCo。但是,我们将 Sonar 与 Groovy 和 Cobertura 结合使用。