[hamcrest] Matcher 만들기
hamcrest는 Mockito와 JUnit 등 테스트 관련 프레임워크에서 참조하는 라이브러리로, Matcher라는 개념을 제공해줍니다. 이것을 사용해서 테스트를 좀 더 간편하게 만들 수 있습니다.
예를 들어, 다음과 같은 테스트가 있습니다.
ConfirmMailTest
...
Member member = new Member();
member.setEmail("keesun@mail.com");
member.setName("keesun");
ConfirmMail mail = new ConfirmMail(member);
assertThat(Arrays.asList(mail.getTos()), hasItem("keesun@mail.com"));
assertThat(mail.makeMessage(), containsString("회원 인증 메일 입니다"));
assertThat(mail.getFrom(), is("s2cmailer@gmail.com"));
assertThat(mail.getSubject(), containsString("keesun"));
...
이 테스트에서 필요한 Matcher로 isAbout(Membe member)라는 것을 하나 만들고 다음과 같은 클래스를 정의합니다. 아. 그전에 위 테스트 코드를 미리 다음과 같이 수정해 두는 것이 좋겠습니다.
Member member = new Member();
member.setEmail("keesun@mail.com");
member.setName("keesun");
ConfirmMail mail = new ConfirmMail(member);
assertThat(mail, isAbout(member));
그런다음 클래스를 정의합니다. 이 클래스는 Mockito의 ArgumentMatcher 클래스를 상속 받고, isAbout이라는 static 메서드를 제공해줍니다.
public class MailMatcher extends ArgumentMatcher<SpringSproutMail> {
private String from;
private String to;
private String subject;
private String message;
public MailMatcher(String from, String to, String subject, String message) {
super();
this.from = from;
this.to = to;
this.subject = subject;
this.message = message;
}
@Override
public boolean matches(Object mail) {
SpringSproutMail smail = (SpringSproutMail) mail;
if (from != null && !from.equals(smail.getFrom()))
return false;
if (!Arrays.asList(smail.getTos()).contains(to))
return false;
if (!smail.getSubject().contains(subject))
return false;
if (!smail.makeMessage().contains(message))
return false;
return true;
}
public static Matcher<SpringSproutMail> isAbout(Member member) {
return new MailMatcher(SpringSproutMail.SENDER_MAIL, member.getEmail(),
member.getName(), "회원 인증 메일");
}
}
배보다 배꼽이 큰거 아닌가 하는 생각이 들지만, 이 매처 클래스를 여러 메일 테스트에서 사용할 수 있도록 조금 손을 본다면 쓸만할 겁니다.