Gdybym miał odgadnąć cel twojego pytania, powiedziałbym:
- Chcesz rozsądnych kontroli dla prywatnych konstruktorów, którzy wykonują rzeczywistą pracę, i
- Chcesz, aby koniczyna wykluczyła puste konstruktory dla klas util.
W przypadku 1 jest oczywiste, że chcesz, aby cała inicjalizacja była wykonywana metodami fabrycznymi. W takich przypadkach twoje testy powinny być w stanie przetestować skutki uboczne konstruktora. Powinno to należeć do kategorii zwykłych prywatnych metod testowania. Zmniejsz metody, tak aby wykonywały tylko ograniczoną liczbę określonych rzeczy (najlepiej tylko jedną rzecz i dobrze jedną rzecz), a następnie przetestuj metody, które na nich polegają.
Na przykład, jeśli mój [prywatny] konstruktor ustawia pola instancji mojej klasy a
na 5
. Wtedy mogę (a raczej muszę) to przetestować:
@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
}
W przypadku wersji 2 możesz skonfigurować clover, aby wykluczał konstruktory Util, jeśli masz ustawiony wzorzec nazewnictwa dla klas Util. Np. W moim własnym projekcie używam czegoś takiego (ponieważ przestrzegamy konwencji, że nazwy wszystkich klas Util powinny kończyć się na Util):
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
Celowo pominąłem .*
następujące, )
ponieważ takie konstruktory nie są przeznaczone do rzucania wyjątków (nie mają nic robić).
Oczywiście może istnieć trzeci przypadek, w którym możesz chcieć mieć pusty konstruktor dla klasy nieużytkowej. W takich przypadkach radziłbym umieścić methodContext
dokładny podpis konstruktora.
<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>
Jeśli masz wiele takich wyjątkowych klas, możesz zmodyfikować uogólniony prywatny konstruktor reg-ex, który zasugerowałem, i usunąć Util
go. W takim przypadku będziesz musiał ręcznie upewnić się, że efekty uboczne twojego konstruktora są nadal testowane i objęte innymi metodami w twojej klasie / projekcie.
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>