如果你绝对需要实现100%的代码覆盖率 - 其优点可以在其他地方:)进行辩论 - 你可以在测试中使用反射来实现它。习惯上,当我实现一个仅静态的实用程序类时,我会添加一个私有构造函数,以确保无法创建该类的实例。例如:
/**
* Constructs a new MyUtilities.
* @throws InstantiationException
*/
private MyUtilities() throws InstantiationException
{
throw new InstantiationException("Instances of this type are forbidden.");
}
然后,您的测试可能如下所示:
@Test
public void Test_Constructor_Throws_Exception() throws IllegalAccessException, InstantiationException {
final Class<?> cls = MyUtilties.class;
final Constructor<?> c = cls.getDeclaredConstructors()[0];
c.setAccessible(true);
Throwable targetException = null;
try {
c.newInstance((Object[])null);
} catch (InvocationTargetException ite) {
targetException = ite.getTargetException();
}
assertNotNull(targetException);
assertEquals(targetException.getClass(), InstantiationException.class);
}
基本上,您在此处要执行的操作是按名称获取类,查找该类类型的构造函数,将其设置为 public(调用),调用不带参数的构造函数,然后确保引发的目标异常是 .setAccessible
InstantiationException
无论如何,正如你所说,这里的100%代码覆盖率要求有点痛苦,但听起来好像它超出了你的控制范围,所以你对此无能为力。我实际上在我自己的代码中使用了与上述类似的方法,我确实发现它是有益的,但不是从测试的角度来看。相反,它只是帮助我学到了比我之前所知道的更多的反思:)