【问题标题】:How to add static member variables Jacoco Test Coverage?如何添加静态成员变量 Jacoco 测试覆盖率?
【发布时间】:2015-07-19 05:14:19
【问题描述】:

我有一门课如下:

public class XConstants {

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

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

【问题讨论】:

    标签: java sonarqube jacoco jacoco-maven-plugin


    【解决方案1】:

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

    aload_0
    invokespecial Object.<init>
    return
    

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

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

    【讨论】:

    • 感谢@Tagir,这是有道理的。你知道任何解决方法吗?如果我使用 Enum 会怎样?
    • 添加了建议。
    【解决方案2】:

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

    private XConstants {}
    

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

    assertUtilityClassWellDefined(XConstants.class)
    

    【讨论】:

      【解决方案3】:

      您已经创建了一个可以实例化的类,但您从未实例化过它,所以从技术上讲,您没有涵盖该代码。 “充满常量的类”的简单解决方案是将其改为接口。另请注意,接口中的变量默认为 public、static 和 final,因此您的代码可以简单地如下所示:

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

      【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多