模拟 IMAP 或 POP 服务器进行单元测试的最简单方法是什么?

2022-09-01 13:01:10

我想对一个从电子邮件收件箱获取邮件的Java应用程序进行单元测试,就像这个家伙一样。目前,我对我们公司的真实邮件服务器上的真实邮箱运行单元测试,该邮箱易于设置,但具有以下缺点:

  • 在运行测试之前,您必须发送实际的电子邮件
  • 添加更多测试用例可能很困难,例如,因为您可能希望针对不同的安全策略进行测试
  • 该测试依赖于与邮件服务器的工作网络连接和现有的邮件帐户,该帐户以一种对我来说毫无意义的方式将开发和系统管理结合起来。

我想在本地端口上启动IMAP服务器,该服务器根据与测试类一起存储在文件中的测试数据伪造收件箱。我可以想到以下方法:

  • 运行套接字服务器并实现基本的 IMAP 子集
  • 使用用于构建电子邮件服务器的更高级别库
  • 使用可以嵌入到测试中的现有电子邮件服务器实现

我想避免第一种选择,它看起来有点简单,但我从类似的经验中猜测,还有很长的工作要做。想想想要测试安全连接等。同样,第二个选项似乎有很多工作,但我还没有找到一个邮件服务器可以允许第三个选项。

如果这很重要,我在构建过程中使用Maven和TestNG。


答案 1

Greenmail 可能很有用。

GreenMail是一个开源,直观且易于使用的电子邮件服务器测试套件,用于测试目的。支持 SMTP、POP3、IMAP 和 SSL 套接字支持。


答案 2

编写一个依赖于现有邮件服务器的测试,以检查您的代码是否可以访问它。此代码应执行正确的设置(即,它应该向自己发送邮件)。使用一些全局变量保护此测试,或者您可以在运行时启用/禁用它。System.property

将用于访问服务器的代码移动到隔离类中。

在测试中重写此类。在测试中,只需检查邮件文本是否正确。如果您收到访问服务器中断的错误报告,请启用“访问真实服务器测试”并进行检查。