在没有电子邮件的情况下运行Junit电子邮件测试实际上正在外出

时间:2009-06-22 14:42:59

标签: java unit-testing email junit

我想在某些模型类上运行单元测试(Junit),这些模型类通常会发送确认事情发生的电子邮件。是否有一个模拟电子邮件服务器,您可以使用单元测试,以确认您的运行尝试发送电子邮件而不实际发送电子邮件?

这似乎很不错,只是不确定我想写自己的。电子邮件方面的应用程序堆栈是Velocity + Spring,因此最好只需更改applicationContext.xml文件即可指向测试服务器。

7 个答案:

答案 0 :(得分:29)

备选答案:Dumbster是一个虚假的SMTP服务器,专为测试而设计。它是用Java编写的。

答案 1 :(得分:15)

我认为Mock JavaMail项目就是你想要的。

答案 2 :(得分:12)

我会看看GreenMail是否还活着(显然Dumbster死了),它有很多功能和很好的例子。

http://www.icegreen.com/greenmail/

答案 3 :(得分:3)

我假设您使用的是Javamail,问题是javax.mail.Session是最终的,因此无法模拟。

似乎其他人建议您只需定义自己的“邮件会话”界面并创建使用Javamail的实现。在您的测试中,您只需在“真实世界模式”中注入模拟,然后注入Javamail实现。

JMock和EasyMock都支持您要发送的消息的所有断言,并且您的测试已完成。

顺便说一句,我通常会尝试避免单元测试中的任何进程外调用 - 它会在您经常运行测试套件时将其杀死,这通常转化为运行较少且代码库问题开始发生。

答案 4 :(得分:1)

您可以尝试JavaMail Mock2 https://github.com/salyh/javamail-mock2

它主要关注IMAP / POP3,但也可以使用SMTP Mock。它可以在maven中心使用。

功能

  • 支持imap,imaps,pop3,pop3s,smtp,smtps
  • 支持POP3:强制转换为POP3Folder,Folder.getUID(消息消息)
  • 支持IMAP:强制转换为IMAPFolder,强制转换为UIDFolder,子文件夹,-Folder.getMessagesByUID(...),删除/重命名文件夹,附加消息
  • 支持SMTP:Mock Transport.send()
  • 目前不支持:IMAP扩展,如IDLE,CONDSTORE,...以及强制转换为POP3Message / IMAPMessage,存储侦听器

答案 5 :(得分:0)

Phil Haack有一个blog post about unit testing email sending,他在一个免费软件邮件服务器上编写了一个解决方案。

答案 6 :(得分:0)

我的解决方案是将邮件服务器包装在一个类中,该类接受所有配置选项并具有send()方法。在我的测试中,我会模拟这个类并使用保存断言当前参数的东西覆盖send()

要测试邮件服务本身是否有效,请在本地发送邮件。如果你在Windows上,请尝试hMail