我有一个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没有改变任何其他内容,报告完全覆盖了它:
为什么会这样?
答案 0 :(得分:3)
我不知道它是否适用于您的具体示例,但请记住,代码覆盖工具通常不适用于替代JVM语言,除非它们明确支持它们。这是因为几乎所有这些语言都生成额外的字节代码,这些代码只能在某些情况下执行。例如,Groovy可能会为慢速路径和快速路径生成字节代码,并且可能会自动在它们之间做出决定,而无需用户说话。
Groovy 3.0可以改善这种情况,它将围绕Java invokedynamic设计,这意味着必须生成较少的“魔术”字节代码。同时,我听说Clover有明确的Groovy支持,虽然我不知道它是如何最新的。
答案 1 :(得分:1)
因此,事实证明,Sonar的Jacoco插件明确地寻找Java代码。我知道这一点,因为我通过它进行了调试。它解码jacoco exec文件,并假设任何文件都是JavaFile,它找不到,然后说你没有覆盖信息。
因此,我抓住了Jacoco插件的源代码(它从他们的Subversion存储库中消失了,并且从未出现在我可以找到的Github上)并将其折叠成一个新的Groovy插件。我更新的一个使用Codenarc 0.18.1(它将Narc从32增加到305)并识别任何类型的Jacoco文件 - 现有插件中的代码是不必要的错误。
源代码在这里:https://github.com/rvowles/sonar-groovy - 只需构建它并将其放在extensions / plugins目录中。