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(), "회원 인증 메일");
    }

}

배보다 배꼽이 큰거 아닌가 하는 생각이 들지만, 이 매처 클래스를 여러 메일 테스트에서 사용할 수 있도록 조금 손을 본다면 쓸만할 겁니다.