在一个项目中,我有一个 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
偷看,找不到候选人,但也许我错过了它?
答案 0 :(得分:9)
我将enum
用于实用程序类,并且大多数覆盖工具都知道忽略它的方法。
public enum Util { ;
enum
默认为final
,private
个构造函数。
答案 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);
}
我习惯以这种方式验证私有构造函数只是为了清楚类的原始意图,无论它是实用类还是具有常量的类等......