day*_*mer 0 junit unit-testing scala scalatest
我正在学习Scala并编写了Email类似于以下内容的类:
class Email(emailConfigName: String) {
private val emailConfig = ConfigFactory.load(emailConfigName) getConfig ("email")
def notifySupportForTenant(symbolicName: String) {
val emailMessage: Message = constructEmailMessage(symbolicName)
Transport.send(emailMessage)
}
def constructEmailMessage(symbolicName: String): Message = {
val message = createMessage(emailConfig getString ("shn.mail.smtp.host"))
message setFrom (new InternetAddress(emailConfig getString ("shn.mail.from")))
// todo: should come from API (sent by client)
message setSentDate (new Date())
message setSubject (emailConfig getString ("shn.mail.subject") replace("TENANT_ID", symbolicName))
message setContent(emailConfig getString ("shn.mail.body"), "text/html")
message.setRecipients(Message.RecipientType.TO, getMessageRecipients(emailConfig getString ("shn.mail.recipient")))
message
}
private def createMessage(smtpHost: String): Message = {
val properties = new Properties()
properties put("mail.smtp.host", smtpHost)
val session = Session.getDefaultInstance(properties, null)
return new MimeMessage(session)
}
private def getMessageRecipients(recipient: String): Array[Address] = {
// had to do the asInstanceOf[...] call here to make scala happy
val addressArray = buildInternetAddressArray(recipient).asInstanceOf[Array[Address]]
if ((addressArray != null) && (addressArray.length > 0)) addressArray
else
throw new IllegalArgumentException("no recipients found to send email")
}
private def buildInternetAddressArray(address: String): Array[InternetAddress] = {
// could test for a null or blank String but I'm letting parse just throw an exception
return InternetAddress.parse(address)
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试这个类的公共API,notifySupportForTenant但这不适合单元测试,因为它还调用Transport.send(emailMessage)将发送电子邮件.
我有兴趣测试消息是否构造正确.这意味着我需要测试constructEmailMessage.
为了测试这个,我不得不把public它作为公共接口公开,我不喜欢.我能做什么?
在传统的OO中,编程方法通常是私有的,因此它们不能被外部调用并破坏实例的状态.一旦你的方法真的是一个没有副作用的函数(如图所示constructEmailMessage),真的没有理由把它变成私有的.
由于您的目的是学习scala,我建议您尽可能采用对不可变数据进行操作的函数式,因为它减轻了OO编程支持受保护封装的许多原因.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |