mock-javamail
「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を利用する事でログ見れる模様