====== Equals Verifier ======
* http://www.jqno.nl/equalsverifier/
* Java 클래스의 ''equals''와 ''hashCode'' 메소드는 일반적으로 자동 생성하는 방식을 사용하는데 Java Code Coverage에서 매우 많은 커버리지를 깎아먹는 부분이다. 이에 ''equals''와 ''hashCode''에 대해 자동 테스트를 하여 커버리지를 높여주는 역할을 한다.
* 이름은 ''EqualsVerifier''이지만 ''hashCode''까지 처리한다.
* 테스트를 실행했는데 오류가 발생하면 http://www.jqno.nl/equalsverifier/errormessages 에 가서 오류 메시지를 찾아서 해결책을 보고 따라하면 해결이 된다.
===== Lombok equals hashCode 테스트 =====
* ''EqualsVerifierExample''이라는 Lombok ''@Data'' 애노테이션이 적용된 클래스가 있을 때
@Test
public void equalsAndHashCodeContract() throws Exception {
class SubEqualsVerifierExample extends EqualsVerifierExample {
@Override
public boolean canEqual(Object obj) {
return false;
}
}
EqualsVerifier.forClass(EqualsVerifierExample.class)
.suppress(Warning.NULL_FIELDS, Warning.NONFINAL_FIELDS)
.withRedefinedSubclass(SubEqualsVerifierExample.class)
.verify();
}
* 커버리지가 낮게 나오면 ''suppress'' 부분을 제거하고 해본다.
===== IntelliJ Live Template =====
==== java ====
class Sub$CLASS$ extends $CLASS$ {
@Override
public boolean canEqual(Object obj) {
return false;
}
}
EqualsVerifier.forClass($CLASS$.class)
.suppress(Warning.NULL_FIELDS, Warning.NONFINAL_FIELDS)
.withRedefinedSubclass(Sub$CLASS$.class)
.verify();
* Applicable in Java: statement
* Reformat according to style : check
* Use static import if possible : check
* Short FQ names : check
==== Groovy Spock ====
static class Sub$CLASS$ extends $CLASS$ {
@Override
boolean canEqual(Object obj) {
return false
}
}
def "equalsAndHashCode verify"() {
expect:
EqualsVerifier.forClass($CLASS$.class)
.suppress(nl.jqno.equalsverifier.Warning.NONFINAL_FIELDS, nl.jqno.equalsverifier.Warning.ALL_FIELDS_SHOULD_BE_USED)
.withRedefinedSubclass(Sub$CLASS$.class)
.withRedefinedSuperclass()
.verify()
}
* Applicable in Spock Specification
* Reformat according to style : check
* Use static import if possible : check
* Short FQ names : check