Wenn ich die Absicht Ihrer Frage erraten würde, würde ich sagen:
- Sie möchten angemessene Überprüfungen für private Konstruktoren, die tatsächlich arbeiten, und
- Sie möchten, dass Clover leere Konstruktoren für util-Klassen ausschließt.
Für 1 ist es offensichtlich, dass die gesamte Initialisierung über Factory-Methoden erfolgen soll. In solchen Fällen sollten Ihre Tests in der Lage sein, die Nebenwirkungen des Konstruktors zu testen. Dies sollte unter die Kategorie der normalen privaten Methodentests fallen. Verkleinern Sie die Methoden so, dass sie nur eine begrenzte Anzahl bestimmter Dinge ausführen (im Idealfall nur eine Sache und eine Sache gut), und testen Sie dann die Methoden, die auf ihnen beruhen.
Zum Beispiel, wenn mein [privat] Konstruktor setzt auf meine Klasse Instanzfelder a
zu 5
. Dann kann (oder muss) ich es testen:
@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
}
Für 2 können Sie clover so konfigurieren, dass Util-Konstruktoren ausgeschlossen werden, wenn Sie ein festgelegtes Namensmuster für Util-Klassen haben. ZB verwende ich in meinem eigenen Projekt so etwas (weil wir der Konvention folgen, dass Namen für alle Util-Klassen mit Util enden sollten):
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
Ich habe bewusst eine .*
Gefolgschaft ausgelassen)
weil solche Konstruktoren keine Ausnahmen auslösen sollen (sie sollen nichts tun).
Es kann natürlich einen dritten Fall geben, in dem Sie möglicherweise einen leeren Konstruktor für eine Nicht-Utility-Klasse haben möchten. In solchen Fällen würde ich empfehlen, dass Sie eine methodContext
mit der genauen Signatur des Konstruktors eingeben.
<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>
Wenn Sie viele solcher außergewöhnlichen Klassen haben, können Sie den von mir vorgeschlagenen verallgemeinerten privaten Konstruktor reg-ex ändern und daraus entfernen Util
. In diesem Fall müssen Sie manuell sicherstellen, dass die Nebenwirkungen Ihres Konstruktors weiterhin getestet und von anderen Methoden in Ihrer Klasse / Ihrem Projekt abgedeckt werden.
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>