【问题标题】:Running Junit Email Tests Without Emails Actually Going Out在没有电子邮件实际出去的情况下运行 Junit 电子邮件测试
【发布时间】:2010-11-04 21:12:22
【问题描述】:

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

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

【问题讨论】:

标签: java unit-testing email junit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 绝对 - 永远不要自己模拟第 3 方界面,这很少值得花时间。 (如果您愿意 - 使用 PowerMock)。但是在这种情况下,只需将 Mock JavaMail 放在适当的位置,所有的消息都会神奇地保存在一个模拟邮箱中,供您检查和断言。简单而有效(只要把它放在你的生产类路径之外!)
    • 链接网站已关闭。
    【解决方案3】:

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

    要测试邮件服务本身是否正常工作,请在本地给自己发送一封邮件。如果您使用的是 Windows,请尝试 hMail

    【讨论】:

    • 我在 Windows 上开发,但是我在 Ubuntu 上运行持续集成服务器,所以这行不通。
    • 当然;使用地址“localhost”或“127.0.0.1”并在 Ubunutu 上为邮件添加与 Windows 上相同的帐户。我不确定 Ubuntu 使用什么,但它已经安装了邮件服务器。可能是 qmail 或 postfix。
    【解决方案4】:

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

    【讨论】:

    • 这种方法+1,尽管 SubEthaSMTP 可能比 Dumbster 更容易使用。
    • 这正是我所要求的。我现在要使用它,我可能会在某个时候改用模拟对象来加快测试速度。
    • 请注意 - 使用 Dumbster 运行时,我的单元测试需要大约 500 毫秒来启动服务器、发送电子邮件并测试电子邮件是否已发送。这比我需要很长时间的 Jersey 框架测试要好得多。
    • 答案中的 Dumbster 链接已失效
    【解决方案5】:

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

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

    JMock 和 EasyMock 都将支持您可能想要对您发送的消息做出的所有断言,并且您的测试已完成。

    顺便说一句,我通常会尽量避免来自单元测试中的任何进程外调用 - 当您频繁运行测试套件时,它会杀死您,这通常会导致它运行得更少,这就是代码库问题开始发生。

    【讨论】:

    • 这真是一个很好的评论,让我对我的方法有了更多的思考。我正在考虑生成一个进程,但更有可能的是,我应该在我的 spring 配置 xml 中实例化一个模拟电子邮件服务器的 bean。
    • 嗨史蒂夫 - 这正是重点。如果你有另一个进程突然作为你的端点运行,那么断言就会变得困难,所以你的测试最终只是确保你没有从另一个进程中得到错误,这可能不是同一个进程将在愤怒中使用,所以实际上是一个静音测试 - 毕竟我认为假设 Javamail 工作是安全的;-) 模拟方法允许您验证我认为是真正测试的消息内容....跨度>
    【解决方案6】:

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

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

    特点

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多