如何添加静态成员变量 Jacoco 测试覆盖率?

我有一个类如下:

public class XConstants {

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

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


答案 1

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

aload_0
invokespecial Object.<init>
return

所以当你不叫它的时候,你有0%,当你叫它的时候,你有100%。

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


答案 2

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

private XConstants {}

然后使用 Trajano commons-testing library 断言这个构造函数是私有的,并调用它来满足覆盖率:

assertUtilityClassWellDefined(XConstants.class)

推荐