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

时间:2015-01-02 21:45:38

标签: java intellij-idea code-coverage test-coverage

在一个项目中,我有一个 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) {...}
}

该类是一个Utility类,因为它只包含 static方法。 因此,它声明为final,其构造函数为private 。 创建实例或派生子类根本没有任何意义。

我有一套测试项目的单元测试。 我正在使用 IntelliJ IDEA 来运行测试,测量和可视化代码覆盖率。 实用程序class Util的构造函数现在降低了覆盖范围。 我希望看到100%的100%逻辑覆盖率。 类似于Utility类的私有构造函数的代码会降低覆盖率。

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

我知道一般来说,覆盖率报告中的隐藏代码对您自己不利。我不介意报告是否会有一个“被忽略的项目”列表 - 实际上,这将是好的,检查是否有人忽略了不应忽略的东西。关键是覆盖范围没有意义的代码,就像Utility类的私有构造函数一样。

我试图找出annotations.jar是否包含候选人。唯一一个看起来就像它可以做到的那样的注释是TestOnly,但它不能实现这个目的。 我也在plugins/coverage/lib/*.jar偷看,找不到候选人,但也许我错过了它?

2 个答案:

答案 0 :(得分:9)

我将enum用于实用程序类,并且大多数覆盖工具都知道忽略它的方法。

public enum Util { ;

enum默认为finalprivate个构造函数。

答案 1 :(得分:4)

这个问题目前已有一年多了;但是,我认为我可以在单元测试中提供忽略私有构造函数的替代方法。尽管不太可能,但可以绕过Java中的私有构造函数。此外,它可能在将来修改类,有人可以添加构造函数等...有一个单元测试验证这可能感觉多余,但它确实增加了另一层次的意图清晰度。一个失败的单元测试肯定会引起我的注意,“我导致单元测试失败,我确定我知道我在这里改变了什么?”

这里有一些示例代码。

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

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);
}

我习惯以这种方式验证私有构造函数只是为了清楚类的原始意图,无论它是实用类还是具有常量的类等......