3

我正在使用 Maven (2) Cobertura 插件来创建代码覆盖率报告,并且我在方法中使用了以下存根:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");

我知道我需要记录异常等,但这不是现在的重点……Cobertura 拒绝承认打印堆栈跟踪后的行已被覆盖。也就是说,System.err.println语句之前带有“}”的行没有显示为已覆盖。之前,方法的结尾大括号没有显示为被覆盖,因此System.err声明。知道如何说服 cobertura 的 maven 插件,因为该System.err.println语句已被涵盖,因此必须涵盖结束大括号?

哦,是的,我使用模拟安全管理器来抛出安全异常,因为这是我发现的让测试在System.exit调用后继续执行的最简单方法。

4

4 回答 4

9

我会看报道。仔细检查我的测试。请注意,代码确实被覆盖了,不必担心达到 100%。代码覆盖率最好用于查找您可能忽略的测试区域,但只专注于获得 100% 的覆盖率作为目标是一个坏习惯,可能会导致您跳过需要编写的测试,因为您的工具显示100%。将工具用于它可以做的事情,但不要陷入让工具定义你所做的事情的陷阱。

于 2008-10-13T01:44:19.363 回答
4

在 Java 类文件格式中,每个方法都用一个表将代码偏移量映射到行号进行注释。在这种情况下,右大括号不会产生任何字节码,因此它没有被覆盖。这是源代码和字节码之间不完全对应的问题。它应该由覆盖工具处理,将此行识别为非代码。

我知道艾玛也有类似的问题。Clover的情况要好得多,但是是商业的(不确定它是否也能处理这种情况)。如果您使用 IDEA,您应该尝试他们的新覆盖实现- 它非常好并且正在积极开发中。

于 2008-10-13T02:00:21.767 回答
1

我有一段时间没有使用 Cobertura(2005 年?),当时看到了这种行为。C# 的 NCover 和 catch/finally 块之后的花括号也存在类似的问题。

我的建议是添加到这个 Cobertura 错误报告中,详细说明类似的问题。此外,请遵循@tvanfosson 的建议,并意识到没有覆盖大括号(实际上并没有成为 JVM 中的任何内容)是您可以忽略的“噪音”。

于 2008-10-13T01:46:58.890 回答
0

我知道这是一个老问题,Cobertura 已经解决了这个问题,但是为了完整起见,“}”上的缺失覆盖是由内部自动“finally”块引起的。

如下所示查看您的代码:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

幸运的是,某些版本不再发生这种情况。

于 2013-05-28T17:44:35.147 回答