질문의 의도를 추측한다면 다음과 같이 말하고 싶습니다.
- 실제 작업을 수행하는 개인 생성자에 대한 합리적인 검사를 원합니다.
- clover가 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 생성자를 제외하도록 clover를 구성 할 수 있습니다. 예를 들어, 내 프로젝트에서 다음과 같은 것을 사용합니다 (모든 Util 클래스의 이름이 Util로 끝나야한다는 규칙을 따르기 때문입니다).
<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
<methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>
일부러 .*
다음 항목을 생략했습니다.)
그러한 생성자는 예외를 던지는 것을 의미하지 않기 때문에 (아무것도 할 수 없습니다).
물론 비 유틸리티 클래스에 대해 빈 생성자를 원할 수있는 세 번째 경우가있을 수 있습니다. 이러한 경우 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>