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

Java 模拟IMAP或POP服务器进行单元测试的最简单方法是什么?,java,email,testing,Java,Email,Testing,我想对一个Java应用程序进行单元测试,该应用程序可以从电子邮件收件箱中获取邮件,就像。目前,我在我们公司的real mailserver上对一个真实邮箱进行了单元测试,该邮箱很容易设置,但有以下缺点: 在运行测试之前,您必须发送实际电子邮件 添加更多的测试用例可能很困难,例如,因为您可能希望针对不同的安全策略进行测试 测试依赖于与邮件服务器的工作网络连接和现有邮件帐户,该帐户以一种对我来说毫无意义的方式将开发和系统管理结合起来 我想在本地端口上启动一个IMAP服务器,它根据存储在测试类旁边

我想对一个Java应用程序进行单元测试,该应用程序可以从电子邮件收件箱中获取邮件,就像。目前,我在我们公司的real mailserver上对一个真实邮箱进行了单元测试,该邮箱很容易设置,但有以下缺点:

  • 在运行测试之前,您必须发送实际电子邮件
  • 添加更多的测试用例可能很困难,例如,因为您可能希望针对不同的安全策略进行测试
  • 测试依赖于与邮件服务器的工作网络连接和现有邮件帐户,该帐户以一种对我来说毫无意义的方式将开发和系统管理结合起来
我想在本地端口上启动一个IMAP服务器,它根据存储在测试类旁边的文件中的测试数据伪造一个收件箱。我可以想到以下方法:

  • 运行套接字服务器并实现基本的IMAP子集
  • 使用更高级别的库来构建电子邮件服务器
  • 使用我可以嵌入到测试中的现有电子邮件服务器实现
我想避免第一种选择,它看起来有点简单,但我根据类似的经验猜测,在未来的道路上还有一条长长的工作等待完成。试想一下想要测试安全连接等。类似地,第二个选项似乎需要做很多工作,但我还没有找到一个邮件服务器可以支持第三个选项


如果有必要,我将在构建过程中使用Maven和TestNG。

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

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


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

我建议在测试代码中嵌入纯Java IMAP/POP服务器

为此,您有多种可能性,包括:

  • 使用Javamail编写自己的IMAP模拟
  • 使用
  • 使用JMock模拟邮件服务器的各种接口(毕竟,它必须有一个接口,不是吗?)
    • 可能有用

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

      项目 我在为Jenkins开发插件时遇到了它,使用它是我的梦想

      刚刚进入您的项目,您就可以开始了(我将告诉您如何设置和使用它)

      如果您不耐烦,下面是一个如何使用它的快速示例:

      例子:
      这看起来很好,他们有代码示例和Maven指令,很好!我不知道那个项目+1@PascalThivent——老实说,我也不知道。我只是擅长谷歌搜索:)这就是我喜欢的原因——它能让你找到非常有用的东西。事实上,我猜这就是谷歌富。但这是一个非常好的发现。这也是我正在使用的,它在使用适当的模拟框架时非常适合+1。试着让你测试的东西尽可能简单。不想担心与不同邮件服务器集成的复杂性。禁用发送电子邮件是个坏主意。如果有人忘记添加-Dsomething=false,并且实际上会向你的邮箱发送1000封电子邮件怎么办?为什么你的测试会发送1000封电子邮件,除非你是垃圾邮件发送者?我禁用了这些测试,因为它们运行时间太长:所有单元测试都必须在10秒内运行。
      // Setup test: add mail to inbox
      Mailbox tmp = Mailbox.get("foo@bar.com");
      tmp.add(/* your javax.mail.Message */)
      assertEquals 1, tmp.size()
      
      // Connect to the inmemory mailbox using "imap"
      Session session = Session.getInstance(System.getProperties(), null);
      Store store = session.getStore('imap');
      store.connect("bar.com","foo","anything");
      
      // Check the mail exists!
      Folder inbox = store.getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);
      assertEquals 1, inbox.getMessageCount()
      store.close();