Keep on moving

あんまりまとまってないことを書きますよ

Scala(っていうかCommonsEmail)でMail送信をテストしたい

ScalaでEmail送りたいと思ってググったらCommons Email - Homeってのを
使うのがいいみたい。内部的にはJavaMailAPIってのを使ってるみたいですね。

Apache Commons Emailでメールを送信する

exception周りとか書いてないけどこんな感じで送信できます。

import org.apache.commons.mail.SimpleEmail

case class SendMailInfo(to: String, from: String, subject: String, msg: String)

class MyMailSender(sendHostName: String, charSet: String = "UTF-8") {

 def sendMail(mailInfo: SendMailInfo) {

   new SimpleEmail {
     setCharset(charSet)
     setHostName(sendHostName)
     setFrom(mailInfo.from)
     addTo(mailInfo.to)
     setSubject(mailInfo.subject)
     setMsg(mailInfo.msg)
   }.send
 }
}

テストの書き方

ユニットテストするときにはhttp://java.net/projects/mock-javamailを使うとモックを使ったテストが書けるみたい。*1
Commons EmailはJavaMail APIを使ってるのでこのライブラリ使えばmockを使ったテストが可能です。
今回は送信をチェックしたいのでこれでテストします。

import org.scalatest.FunSuite
import org.scalatest.BeforeAndAfter
import org.jvnet.mock_javamail.Mailbox

class MyMailSenderTest extends FunSuite with BeforeAndAfter {

  val HOST_NAME = "mail.example.com"
  var mailSender: MyMailSender = null

  before {
    mailSender = new MyMailSender(HOST_NAME)
    //clear Mock JavaMail box
    Mailbox.clearAll()
  }

  test("testSendInMockWay") {

    val subject = "Test2"
    val body = "Test Message2"
    mailSender.sendMail(SendMailInfo("to@example.com", "from@example.com", subject, body))

    // check JavaMail box
    val inbox = Mailbox.get("to@example.com")
    assert(inbox.isEmpty === false)
    assert(inbox.size() === 1)
    assert(subject === inbox.get(0).getSubject)
    assert(body === inbox.get(0).getContent)

 }
}

対象バージョン

  • Apache Commons Mail 1.2
  • mock-javamail 1.9

sbt

      libraryDependencies ++= Seq(
	"org.apache.commons" % "commons-email" % "1.2",

        // test
        "org.scalatest" %% "scalatest" % "1.8" % "test",
	"org.jvnet.mock-javamail" % "mock-javamail" % "1.9" % "test",

      )

*1:このライブラリJenkins作者のkohsukeさんが書いてるんですなぁ