如何添加静态成员变量Jacoco Test Coverage?

How to add static member variables Jacoco Test Coverage?

我有一个 class 如下:

public class XConstants {

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

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

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

aload_0
invokespecial Object.<init>
return

所以不叫的时候是0%,叫的时候是100%。

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

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

private XConstants {}

然后使用 Trajano commons-testing 库断言此构造函数是私有的并调用它以满足覆盖率:

assertUtilityClassWellDefined(XConstants.class)

您制作了一个 class,它可以实例化,但您从未实例化过它,因此从技术上讲您没有涵盖该代码。 "class full of constants" 的简单解决方案是将其改为接口。另请注意,接口中的变量默认为 public、static 和 final,因此您的代码可以简单地如下所示:

public interface XConstants {
   int A_TYPE = 1;
   int B_TYPE = 2;
}

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