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)。