如果我猜到您的问题的意图,我会说:
- 您需要对进行实际工作的私有构造函数进行合理的检查,并且
- 您希望三叶草排除util类的空构造函数。
对于1,很明显,您希望所有初始化都通过工厂方法完成。在这种情况下,您的测试应该能够测试构造函数的副作用。这应该属于常规私有方法测试的类别。使方法更小,以便它们仅执行有限数量的确定事情(理想情况下,一件事情一件事情都做得很好),然后测试依赖它们的方法。
例如,如果我的[private]构造函数将类的实例字段设置a
为5
。然后,我可以(或更确切地说必须)对其进行测试:
@Test
public void testInit() {
MyClass myObj = MyClass.newInstance(); //Or whatever factory method you put
Assert.assertEquals(5, myObj.getA()); //Or if getA() is private then test some other property/method that relies on a being 5
}
对于2,如果您为Util类设置了命名模式,则可以将三叶草配置为排除Util构造函数。例如,在我自己的项目中,我使用类似以下的内容(因为遵循所有Util类的名称都应以Util结尾的约定):
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
我故意省略了.*
以下内容,)
因为此类构造函数无意引发异常(它们无意做任何事情)。
当然,在第三种情况下,您可能希望为非实用程序类使用空的构造函数。在这种情况下,我建议您将a methodContext
与构造函数的确切签名放在一起。
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
<methodContext name="myExceptionalClassCtor" regexp="^private MyExceptionalClass()$"/>
</clover-setup>
如果您有许多此类特殊的类,则可以选择修改我建议的通用私有构造函数reg-ex并Util
从中删除。在这种情况下,您将必须手动确保您的构造函数的副作用仍在测试中,并被类/项目中的其他方法覆盖。
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>