如何在Java应用程序中测试私有构造函数?

2022-08-31 22:20:20

如果一个类包含一堆静态方法,为了确保没有人错误地初始化这个类的实例,我做了一个私有构造函数:

private Utils() {
}

现在。。鉴于看不到构造函数,这怎么能被测试呢?这能被测试吗?


答案 1

使用反射,您可以调用私有构造函数:

Constructor<Util> c = Utils.class.getDeclaredConstructor();
c.setAccessible(true);
Utils u = c.newInstance(); // Hello sailor

但是,即使这样也不可能:

private Utils() {
    throw new UnsupportedOperationException();
}

通过在构造函数中引发异常,可以防止所有尝试。


我也会制作类本身,只是“因为”:final

public final class Utils {
    private Utils() {
        throw new UnsupportedOperationException();
    }
}

答案 2

测试代码的意图 ..始终:)

例如:如果构造函数是私有的要点是看不到,那么你需要测试的是这个事实,而不是别的。

使用反射 API 查询构造函数并验证它们是否具有私有属性集。

我会做这样的事情:

@Test()
public void testPrivateConstructors() {
    final Constructor<?>[] constructors = Utils.class.getDeclaredConstructors();
    for (Constructor<?> constructor : constructors) {
        assertTrue(Modifier.isPrivate(constructor.getModifiers()));
    }
}

如果你想对对象构造进行适当的测试,你应该测试公共API,它允许你获取构造的对象。这就是所述API应该存在的原因:正确构建对象,因此您应该针对该:)对其进行测试。


推荐