mock-javamail

2014-01-07T00:00:00+00:00 Java

「JavaMailを使ってgmailでメールを送る件」なコードをそのまま使う

前回のをそのまま実行すると普通にメール送れるのは良いんですが、それをテストする方法としてまぁちょっと古いけれどもmock-javamailっていうのがある模様。どうやらjavamailで使用するメールトランサポートをモックする事で送ったメールをMailboxクラスで参照できる的な所かと

まぁクラスパスに追加するだけで良い模様。理論的な理由としては微妙だけど、mock-javamailのJARにはMETA-INF/javamail.providersがあり

# See http://java.sun.com/products/javamail/javadocs/javax/mail/Session.html
protocol=smtp; type=transport; class=org.jvnet.mock_javamail.MockTransport; vendor=java.net mock-javamail project;
protocol=pop3; type=store; class=org.jvnet.mock_javamail.MockStore; vendor=java.net mock-javamail project;
protocol=imap; type=store; class=org.jvnet.mock_javamail.MockStore; vendor=java.net mock-javamail project;

てな感じになってる。おそらくはJavaMail本式で持っているのを模倣したクラス的なのに差し替える事で実送信テストを行わずにテスト出来る仕組みを提供しているんかと

使い方は上記でも書いてるようにクラスパスに入れてメールを送信する処理をしてMailboxクラスをテストするっていうだけ

import java.util.List;

import javax.mail.Message;

import org.junit.Before;
import org.junit.Test;
import org.jvnet.mock_javamail.Mailbox;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

public class ClientTest {

    @Before
    public void setUp() {
        Mailbox.clearAll();
    }

    @Test
    public void main() throws Exception {
        Client.main(null);

        List<message> inbox = Mailbox.get("kinjouj@gmail.com");
        assertThat(inbox, hasSize(1));

        Message msg = inbox.get(0);
        assertThat(msg, notNullValue());
        assertThat(msg.getSubject(), is("タイトル"));
    }
}

はい、終わり

ちなみにjavax.mail.Sessionに渡すjava.util.Propertiesで

Properties prop = System.getProperties();
prop.setProperty("mail.debug", "true");
// 以下省略

mail.debugを利用する事でログ見れる模様

JavaMailを使ってgmailでメールを送る件