====== 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