如何将测试覆盖率添加到私有构造函数?

2022-08-31 08:30:58

这是代码:

package com.XXX;
public final class Foo {
  private Foo() {
    // intentionally empty
  }
  public static int bar() {
    return 1;
  }
}

这是测试:

package com.XXX;
public FooTest {
  @Test 
  void testValidatesThatBarWorks() {
    int result = Foo.bar();
    assertEquals(1, result);
  }
  @Test(expected = java.lang.IllegalAccessException.class)
  void testValidatesThatClassFooIsNotInstantiable() {
    Class cls = Class.forName("com.XXX.Foo");
    cls.newInstance(); // exception here
  }
}

工作正常,类已测试。但 Cobertura 说,该类的私有构造函数的代码覆盖率为零。我们如何将测试覆盖率添加到这样的私有构造函数中?


答案 1

我不完全同意Jon Skeet的观点。我认为,如果你能轻松获胜,给你覆盖并消除覆盖报告中的噪音,那么你应该这样做。要么告诉你的覆盖率工具忽略构造函数,要么把理想主义放在一边,编写以下测试并完成它:

@Test
public void testConstructorIsPrivate() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  Constructor<Foo> constructor = Foo.class.getDeclaredConstructor();
  assertTrue(Modifier.isPrivate(constructor.getModifiers()));
  constructor.setAccessible(true);
  constructor.newInstance();
}

答案 2

好吧,有一些方法可以潜在地使用反射等 - 但这真的值得吗?这是一个永远不应该被调用的构造函数,对吧?

如果有一个注释或类似的东西,你可以添加到类中,让Cobertura明白它不会被调用,那就这样做:我认为不值得通过箍来人为地添加覆盖范围。

编辑:如果没有办法做到这一点,只需忍受稍微减少的覆盖范围。请记住,覆盖范围应该是对您有用的东西 - 您应该负责该工具,而不是相反。