私があなたの質問の意図を推測するなら、私は言うでしょう:
- 実際の作業を行うプライベートコンストラクタの妥当なチェックが必要であり、かつ
- クローバーにutilクラスの空のコンストラクターを除外させたいとします。
1の場合、すべての初期化をファクトリーメソッドを介して実行したいことは明らかです。そのような場合、テストはコンストラクターの副作用をテストできるはずです。これは、通常のプライベートメソッドテストのカテゴリに分類されます。メソッドを小さくして、限られた数の決定的なこと(理想的には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>
このようなコンストラクターは例外をスローすることを意図していないため、故意に.*
以下)
を省略しました(何も実行することを意図していません)。
もちろん、非ユーティリティクラスの空のコンストラクタが必要になる3番目のケースもあります。そのような場合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>