【Java】メール送信の単体試験方法の紹介(GreenMail)

メール送信プログラムを作成して試験する時に、単体試験をするための方法に悩んだことはないでしょうか。

単体試験をするためだけに開発環境へメールサーバーを構築するのは手間もかかります。また、他の人がテストするときにも開発環境へメールサーバーを構築してから試験するということも極力やりたくないと思います。

今回は、このような問題を解決するための方法として、単体試験に使用できるメールサーバー機能を持つ「GreenMail」を使用した、サンプルプログラムと使用方法を紹介していきます。

スポンサーリンク

環境

メール送信するためのテストは、以下に記載した環境を使用します。

  • Java:8
  • JavaMail:1.6.2
  • JUnit:4.12
  • GreenMail:1.5.10(2019年3月リリース)

GreenMailとは

メール送受信に関連するテストを簡単にすることを目的としたライブラリとなります。

メールに関連するさまざまなテストを実現することができます。今回は、メール送信に関連する「SMTP」を単体試験で使用する方法のみを紹介しています。

メール送信テスト用のサンプルプログラム

メール送信、メール送信結果を確認するためのサンプルプログラムを以下に記載します。完成版のサンプルプログラムは、「GitHub」にありますのでそちらも参考してください。

import java.util.Properties;

import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetupTest;

public class JavaMailGreenMailTest {

  private GreenMail greenMail;

  @Before
  public void before() {
    // テスト用SMTPサーバを起動します、
    this.greenMail = new GreenMail(ServerSetupTest.SMTP);
    this.greenMail.start();
  }

  @After
  public void after() {
    // テスト用SMTPサーバを終了します。
    this.greenMail.stop();
  }

  @Test
  public void testTransport() throws Exception {

    // メール送信を設定します。
    Properties properties = new Properties();
    properties.put("mail.smtp.host", "localhost");
    properties.put("mail.smtp.port", "3025");
    Session session = Session.getDefaultInstance(properties);

    // メール送信内容を設定します。
    MimeMessage message = new MimeMessage(session);
    message.setRecipient(RecipientType.TO, new InternetAddress("to@example.com"));
    message.setFrom(new InternetAddress("from@example.com"));
    message.setSubject("マルチバイトの件名です!!");
    message.setText("マルチバイトの本文です。");

    // メールを送信します。
    Transport.send(message);

    // メール送信結果を取得します。
    // 宛先、送信元、件名、本文などの確認をできます。
    MimeMessage actual = this.greenMail.getReceivedMessages()[0];
    Assert.assertThat(actual.getRecipients(RecipientType.TO)[0].toString(),
        CoreMatchers.is("to@example.com"));
    Assert.assertThat(actual.getFrom()[0].toString(), CoreMatchers.is("from@example.com"));
    Assert.assertThat(actual.getSubject(), CoreMatchers.is("マルチバイトの件名です!!"));
    Assert.assertThat(actual.getContent().toString(), CoreMatchers.is("マルチバイトの本文です。"));

  }

}

起動方法について

起動方法は、「com.icegreen.greenmail.util.GreenMail」のインスタンス作成後に「start」メソッドを使用します。

@Before
public void before() {
  // テスト用SMTPサーバを起動します、
  this.greenMail = new GreenMail(ServerSetupTest.SMTP);
  this.greenMail.start();
}

インスタンス作成時に引数を指定しない場合は、「ServerSetupTest.ALL」を指定した状態になるため、以下に記載した内容で起動します。

  • ホスト名:127.0.0.1
  • ポート番号
    • smtp:3025
    • smtps:3465
    • pop3:3110
    • pop3s:3995
    • imap:3143
    • imaps:3993

今回のサンプルプログラムの場合は、SMTPのみ使用するため「ServerSetupTest.SMTP」を指定しています。

メール送信結果の確認方法について

メール送信結果を確認するために受信メッセージを取得する方法は、「com.icegreen.greenmail.util.GreenMail」の「getReceivedMessages」をメソッドを使用します。

MimeMessage[] messages = this.greenMail.getReceivedMessages();

受信したメッセージは、「javax.mail.internet.MimeMessage」として取得できるため、取得した情報を確認することでメール送信結果を確認することができます。

終了方法について

起動方法は、「com.icegreen.greenmail.util.GreenMail」の「stop」メソッドを使用します。

@After
public void after() {
  // テスト用SMTPサーバを終了します。
  this.greenMail.stop();
}

まとめ

メール送信に関するテストの方法を紹介しました。紹介したテスト方法を使用して普段のメール送信テストが少しでも楽になることを願います。

【参考資料】