声纳&x2B;JaCoco未将Groovy代码计算在内

声纳&x2B;JaCoco未将Groovy代码计算在内,groovy,sonarqube,jacoco,Groovy,Sonarqube,Jacoco,我有一个Groovy类,只有一个静态方法: class ResponseUtil { static String FormatBigDecimalForUI (BigDecimal value){ (value == null || value <= 0) ? '' : roundHalfEven(value) } } 根据Sonar/JaCoCo的规定,这导致了分支机构的覆盖范围6/12: 所以我把代码改得更…冗长。我不认为原始代码“太聪明”或类似的东

我有一个Groovy类,只有一个静态方法:

class ResponseUtil {
    static String FormatBigDecimalForUI (BigDecimal value){
        (value == null || value <= 0) ? '' : roundHalfEven(value)
    }
}
根据Sonar/JaCoCo的规定,这导致了分支机构的覆盖范围
6/12

所以我把代码改得更…冗长。我不认为原始代码“太聪明”或类似的东西,但我使它更明确、更清晰。这就是:

static String FormatBigDecimalForUI (BigDecimal value) {
    if (value == null) {
        ''
    } else if (value <= 0) {
        ''
    } else {
        roundHalfEven(value)
    }
}
静态字符串格式bigdecimalforui(BigDecimal值){
如果(值==null){
''

}否则如果(value我不知道它是否适用于您的具体示例,但请记住,代码覆盖工具通常不适合替代JVM语言,除非它们明确支持它们。这是因为几乎所有这些语言都会生成额外的字节代码,这些代码可能只在某些情况下执行。例如,Groovy可能会:表示慢路径和快路径的字节代码,并且可能会自动决定它们之间的关系,而用户没有发言权


使用Groovy 3.0可能会改善这种情况,它将围绕Java InvokedDynamic进行设计,这意味着更少的“魔力”字节码必须生成。同时,我听说Clover有显式Groovy支持,尽管我不知道它的最新版本。

因此,正如它所证明的,Sonar的Jacoco插件显式地查找Java代码。我知道这一点,因为我通过它进行调试。它解码Jacoco exec文件,并假设任何文件都是Java文件,并将其保存oesn找不到,然后说你没有覆盖信息

正因为如此,我抓取了Jacoco插件的源代码(它从他们的Subversion存储库中消失了,我找不到它出现在Github上),并将其折叠到一个新的Groovy插件中。我的更新版本使用了Codenarc 0.18.1(它将Narc的值从32增加到305)并识别任何类型的Jacoco文件-现有插件中的代码不必要地错误


源代码在这里:-只需构建它并将其放入扩展/插件目录。

我猜这是Sonar/JaCoCo中的一个bug,因为就我所见,这两种方法都产生非常相似的字节码……我运行了相同的“代码覆盖率如何?”在Cobertura下,它产生了完全相同的结果。在单行上进行了一半测试,在扩展版本上进行了全面测试。这是令人担忧的。我发布了两个生成的字节码,它们在我看来都很好(但显然,多行代码调用
比单行版本更重要)…可能有人遇到了这个问题(并找到了解决办法)在Groovy用户邮件列表中…我会尝试发送一封电子邮件,看看是否有人见过这一点?很抱歉,我想问你一个老问题,但我想知道你是如何将Groovy、Jacoco和Sonar结合在一起使用的。这是我所见过的唯一一个关于这种结合的参考资料。我想我们从来没有真正使用过Jacoco。我们正在使用然而,使用Groovy和Cobertura的声纳。
static String FormatBigDecimalForUI (BigDecimal value) {
    if (value == null) {
        ''
    } else if (value <= 0) {
        ''
    } else {
        roundHalfEven(value)
    }
}