我使用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
调用后让测试继续执行的最简单方法。
答案 0 :(得分:8)
我会查看报道报告。仔细检查我的测试。请注意,代码确实已被覆盖,并且不用担心达到100%。代码覆盖最好用于查找您可能忽略了测试的区域,但只关注将100%覆盖率作为目标是一种坏习惯,可能导致您跳过需要编写的测试,因为您的工具显示100%。使用该工具可以做什么,但不要陷入让工具定义你所做的事情的陷阱。
答案 1 :(得分:4)
在Java类文件格式中,每个方法都使用表映射代码偏移到行号进行注释。在这种情况下,右括号不会产生任何字节码,因此它不会被覆盖。这是源和字节码之间不完美对应的问题。它应该由coverage工具处理,将此行识别为非代码。
我知道Emma有类似的问题。 Clover票价要好得多,但是商业化(不确定它是否会处理这种情况)。如果您使用IDEA,您应该尝试他们的new coverage implementation - 它非常好并且正在积极开发中。
答案 2 :(得分:1)
我有一段时间没有使用过Cobertura(2005年?),当时看到了这种行为。 NCover for C#和catch / finally块之后的花括号也存在类似的问题。
我的建议是添加到this Cobertura bug report detailing a similar issue。另外,按照@ tvanfosson的建议,并意识到没有覆盖大括号,它实际上不会成为JVM中的任何东西,你可以忽略它作为'噪音'。
答案 3 :(得分:0)
我知道这是一个古老的问题,Cobertura已经解决了这个问题,但为了完整起见,“}”的遗失范围是由内部自动“最终”阻止造成的。
请将您的代码视为:
try {
System.exit(0);
} catch (final SecurityException exception) {
exception.printStackTrace();
} finally {
// noop
}
幸运的是,某些版本不再发生这种情况。