如何从 IntelliJ IDEA 的覆盖率测量中排除源代码?

How to exclude source code from coverage measurement in IntelliJ IDEA?

在一个项目中,我有一个 Utility class,它看起来像这样:

public final class Util {
    private Util() {}
    public static String method1(InputStream in) {...}
    public static String method2(BufferedReader in) {...}
    public static String method3(File file) {...}
}

class 是一个实用程序 class,因为它包含 static 方法 。 因此它被声明为 final 并且它的 构造函数是 private。 创建实例或派生子classes 根本没有任何意义。

我有一套测试项目的单元测试。 我正在使用 IntelliJ IDEA 来运行测试、测量和可视化代码覆盖率。 Utility class Util 的构造函数现在降低了覆盖率。 我希望在 100% 的逻辑覆盖率上看到 100%。 像 Utility class 的私有构造函数这样的代码降低了覆盖率。

是否有可能(最好是通过注释)将方法或构造函数标记为与代码覆盖率无关,以便从覆盖率报告中排除此类代码,从而获得 100% 的覆盖率显示覆盖率?

我知道在覆盖率报告中隐藏代码通常会对您不利。我不介意报告是否会有“忽略的项目”列表——实际上,这很好,可以检查是否有人忽略了不应忽略的内容。重点实际上是关于覆盖没有意义的代码,例如 Utility class.

的私有构造函数

我试图查找 annotations.jar 是否包含候选人。唯一看起来甚至可以做到这一点的注解是 TestOnly,但它没有实现这个目的。 我也在 plugins/coverage/lib/*.jar 里四处张望,没找到应聘者,但也许我只是错过了?

更新 这个问题现在已经过时了。同时,IntelliJ IDEA 和 Jacoco 学会了如何忽略没有调用者的私有构造函数的覆盖。我不知道 Java 中有意无法访问代码的任何其他示例会引发讨论以将其排除在覆盖率报告之外。

更新 2 这个问题可能再次与 Java 记录 classes.

的访问器有关

我使用 enum 作为实用程序 类,大多数覆盖工具都知道忽略它的方法。

public enum Util { ;

enumfinal,默认带有 private 个构造函数。

这个问题目前已有一年多了;但是,我认为我可以提供一种替代方法来在单元测试中忽略私有构造函数。尽管不太可能,但可以绕过 Java 中的私有构造函数。此外,class 将来可能会被修改,有人可能会添加一个构造函数等......进行单元测试来验证这一点可能会让人觉得多余,但它确实增加了另一个层次的意图清晰度。失败的单元测试肯定会引起我的注意,"I caused a unit test to fail, am I sure I know what I'm changing here?"

事不宜迟,这里是一些示例代码。

这里我们有一个带有私有构造函数的 class。

public final class ClassWithPrivateCtor
{
  private ClassWithPrivateCtor()
  {
    throw new AssertionError(String.format(
      "Illegal instantiation of class: %s.",
      this.getClass().getName()));
  }
}

这是在 Java 中调用私有构造函数的一种方法。

private static <T> void invokePrivateConstructor(final Class<T> type)
  throws Throwable
{
  final Constructor<T> constructor = type.getDeclaredConstructor();

  constructor.setAccessible(true);

  try
  {
    constructor.newInstance();
  }
  catch (InvocationTargetException ex)
  {
    throw ex.getTargetException();
  }
}

这就是我在单元测试中使用它的方式。

@Test(
  description = "Verify ClassWithPrivateCtor private constructor fails.",
  expectedExceptions = AssertionError.class)
public void classWithPrivateCtorTest()
  throws Throwable
{
  invokePrivateConstructor(ClassWithPrivateCtor.class);
}

我已经养成以这种方式验证私有构造函数的习惯,只是为了清楚 class 的初衷,无论它是实用程序 class 还是 class常量等...