3

使用 SonarQube 的最新版本 (4.3.2),try-with-resources 块会误报catch线路的分支覆盖率。例如:

public List<String> getLines(String filename) {
    try (InputStream inputStream = getInputStream(filename)){
        return IOUtils.readLines(inputStream);
    } catch (IOException e) { // <<<<<<< REPORTS AS BRANCH COVERAGE 2/8 
        throw new IllegalArgumentException(e);
    }
}

但是我的单元测试涵盖了在每个点抛出的异常,并且所有其他行都有 100% 的覆盖率——实际的覆盖率是 100%。“8”从何而来?没有 8 个地方可以抛出异常。

我尝试添加// NOSONAR到问题行,甚至尝试将其添加到每一行,但报告是一样的。

使用时忽略了其他类型的问题// NOSONAR,因此不是声纳配置问题。

我怀疑这是因为声纳不允许在 try-with-resources 块产生的字节码中使用额外的 try-catch 块。

有没有办法装饰成功导致声纳忽略这个特定误报的代码?

4

1 回答 1

7

SonarQube 不支持 Java try-with-resources 构造。

它还报告了使用时的虚假空检查问题。

由于 SonarQube 正在使用其他工具(PMD/FindBugs 等)并且他们使用字节码分析,他们(诚然)说有时这些是误报。“SonarQube 方式”的答案是在正确处理生成的字节码之前不要使用 try-with-resources。

但是,没有理智的开发人员会建议让狗摇尾巴。我的建议是通过 SonarQube 插件标记为 false-positve,但这对测试覆盖率没有帮助,因为它在这种情况下对字节码的分析是错误的。

SonarQube 本身有成千上万的问题(他们吃自己的狗粮)。

于 2014-07-31T12:02:00.553 回答