LoginSignup
7
6

More than 5 years have passed since last update.

JUnitで認証付SMTPサーバ(Gmail)での送信テストを書く

Last updated at Posted at 2012-12-26

Wiserを使うとメール送信のテストコードを書けるんだけど、Gmail等の認証が必要なSMTPを使うコードをテストする場合に、ちょっと工夫が必要だったのでメモ。

MailSender.java
Properties PROP = new Properties();
PROP.put("mail.smtp.auth", "true");
PROP.put("mail.smtp.starttls.enable", "true");

Session sess = Session.getInstance(PROP);
MimeMessage mm = new MimeMessage(sess);
Transport transport = sess.getTransport("smtp");
transport.connect("aaa", "bbb");
transport.sendMessage(mm, mm.getAllRecipients());
transport.sendMessage(mm, new Address[]{new InternetAddress("aaa@aaa.com")});

色々はしょってるけど、こんな感じのメール送信のコードをテストをしようと、wiserをそのまま使ってテストすると、認証処理transport.connect("aaa", "bbb");の所でコケてしまいます。
なので、下のような感じで

MailSenderTest.java
Wiser wiser;
SMTPServer smtpServer;

@Before
public void setup() {
    wiser = new Wiser(587);

    smtpServer = wiser.getServer();
    UsernamePasswordValidator myUsernamePasswordValidator = new UsernamePasswordValidator() {
        @Override
        public void login(String id, String pass) throws LoginFailedException {
            if(id.equals("aaa") && pass.equals("bbb")){
                return;
            }
            throw new LoginFailedException();
        }
    };
    smtpServer.setAuthenticationHandlerFactory(new EasyAuthenticationHandlerFactory(myUsernamePasswordValidator));
    wiser.start();
}

wiserが使ってるSMTPServerのインスタンスに対して、認証用のハンドラーをセットしてあげるといけました。
ハンドラーにはUsernamePasswordValidatorのloginメソッドをオーバーライドした無名クラスをセットすると、ターゲットコードのtransport.connect("aaa", "bbb");が実行されるときにloginメソッドが呼ばれるので、例外が発生しないようにloginメソッドを実装しておけばOK(認証エラーのロジックをテストしたければ、LoginFailedExceptionをスローするようにすればOK)。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6