我有一堂课如下:
public class XConstants {
public static final int A_TYPE = 1;
public static final int B_TYPE = 2;
}
我在我的测试中使用了这两个变量,但是当我用 Jacoco 检查测试覆盖率时,它显示这个类的 %0 测试覆盖率。我的猜测是,这是因为我从不实例化这个类,只使用它的静态变量。我尝试创建一个实例,测试覆盖率达到 %100。我该如何克服这个问题?
我有一堂课如下:
public class XConstants {
public static final int A_TYPE = 1;
public static final int B_TYPE = 2;
}
我在我的测试中使用了这两个变量,但是当我用 Jacoco 检查测试覆盖率时,它显示这个类的 %0 测试覆盖率。我的猜测是,这是因为我从不实例化这个类,只使用它的静态变量。我尝试创建一个实例,测试覆盖率达到 %100。我该如何克服这个问题?
JaCoCo 根据实际执行的字节码百分比来衡量测试覆盖率。声明静态最终原语或字符串常量不会创建要执行的字节码,它只是常量池中的一个条目。您在这里拥有的唯一字节码是隐式默认构造函数,通常如下所示:
aload_0
invokespecial Object.<init>
return
所以当你不调用它时,你有 0%,当你调用它时,你有 100%。
我的建议是忽略这个问题。无论如何,您都不应该尝试实现 100% 的覆盖率。毕竟它不能保证任何事情:即使是 100% 覆盖的代码也可能包含严重的错误。
在我们的项目中,我们通过创建私有构造函数来克服只包含常量的类无法覆盖的问题(遵循来自 的模式java.lang.Math
):
private XConstants {}
然后使用Trajanocommons-testing
库断言这个构造函数是私有的并调用它来满足覆盖:
assertUtilityClassWellDefined(XConstants.class)
您创建了一个可以实例化的类,但您从未实例化它,因此从技术上讲,您没有涵盖该代码。“充满常量的类”的简单解决方案是将其改为接口。还要注意,接口中的变量默认是公共的、静态的和最终的,所以你的代码可以简单地看起来像这样:
public interface XConstants {
int A_TYPE = 1;
int B_TYPE = 2;
}
[更新] jacoco 0.8.0 默认配置了这个,为了让它工作,你需要添加一个私有构造函数。