Se dovessi indovinare l'intento della tua domanda direi:
- Desideri controlli ragionevoli per i costruttori privati che svolgono un lavoro effettivo e
- Vuoi che clover escluda i costruttori vuoti per le classi util.
Per 1, è ovvio che si desidera che tutta l'inizializzazione venga eseguita tramite metodi di fabbrica. In questi casi, i tuoi test dovrebbero essere in grado di testare gli effetti collaterali del costruttore. Questo dovrebbe rientrare nella categoria dei normali test con metodo privato. Rendi i metodi più piccoli in modo che eseguano solo un numero limitato di cose determinate (idealmente, solo una cosa e una cosa bene) e quindi testare i metodi che si basano su di essi.
Ad esempio, se il mio costruttore [privato] imposta i campi di istanza della mia classe a
su 5
. Quindi posso (o meglio devo) testarlo:
@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
}
Per 2, puoi configurare clover per escludere i costruttori Util se hai un modello di denominazione impostato per le classi Util. Ad esempio, nel mio progetto uso qualcosa di simile (perché seguiamo la convenzione secondo la quale i nomi per tutte le classi Util dovrebbero terminare con Util):
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
Ho deliberatamente tralasciato un .*
seguito )
perché tali costruttori non hanno lo scopo di generare eccezioni (non hanno lo scopo di fare nulla).
Ovviamente può esserci un terzo caso in cui potresti voler avere un costruttore vuoto per una classe non di utilità. In questi casi, ti consiglio di inserire una methodContext
con la firma esatta del costruttore.
<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>
Se hai molte di queste classi eccezionali, puoi scegliere di modificare il costruttore privato generalizzato reg-ex che ho suggerito e rimuoverlo Util
. In questo caso, dovrai assicurarti manualmente che gli effetti collaterali del tuo costruttore siano ancora testati e coperti da altri metodi nella tua classe / progetto.
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>