14

我有一堂课如下:

public class XConstants {

    public static final int A_TYPE = 1;
    public static final int B_TYPE = 2;
}

我在我的测试中使用了这两个变量,但是当我用 Jacoco 检查测试覆盖率时,它显示这个类的 %0 测试覆盖率。我的猜测是,这是因为我从不实例化这个类,只使用它的静态变量。我尝试创建一个实例,测试覆盖率达到 %100。我该如何克服这个问题?

4

4 回答 4

14

JaCoCo 根据实际执行的字节码百分比来衡量测试覆盖率。声明静态最终原语或字符串常量不会创建要执行的字节码,它只是常量池中的一个条目。您在这里拥有的唯一字节码是隐式默认构造函数,通常如下所示:

aload_0
invokespecial Object.<init>
return

所以当你不调用它时,你有 0%,当你调用它时,你有 100%。

我的建议是忽略这个问题。无论如何,您都不应该尝试实现 100% 的覆盖率。毕竟它不能保证任何事情:即使是 100% 覆盖的代码也可能包含严重的错误。

于 2015-05-08T10:14:38.997 回答
4

在我们的项目中,我们通过创建私有构造函数来克服只包含常量的类无法覆盖的问题(遵循来自 的模式java.lang.Math):

private XConstants {}

然后使用Trajanocommons-testing库断言这个构造函数是私有的并调用它来满足覆盖:

assertUtilityClassWellDefined(XConstants.class)
于 2015-05-08T10:27:58.447 回答
4

您创建了一个可以实例化的类,但您从未实例化它,因此从技术上讲,您没有涵盖该代码。“充满常量的类”的简单解决方案是将其改为接口。还要注意,接口中的变量默认是公共的、静态的和最终的,所以你的代码可以简单地看起来像这样:

public interface XConstants {
   int A_TYPE = 1;
   int B_TYPE = 2;
}
于 2016-03-11T22:10:42.207 回答
3

[更新] jacoco 0.8.0 默认配置了这个,为了让它工作,你需要添加一个私有构造函数。

于 2018-12-07T20:02:37.487 回答