在 clojure 测试中测试邮件服务器

Testing a mail server in clojure tests

我需要在 clojure 项目中测试我们的邮件服务器。为此,我想我会打开一个模拟服务器并使用这个模拟服务器发送电子邮件并检查它们是否已发送。为此,我找到了这个 server.

能够执行

lein test

并测试每个测试,我需要 运行 SMTP 服务器在每次测试之前和结束时各一次。我还可以 运行 夹具中的服务器并在每次测试后退出它。由于我要 运行 进行大约 100 次测试,因此始终启动和关闭服务器没有意义。

我认为我的方法如下:

1 - 我编写了一个 bash 脚本来启动(模型)邮件服务器,运行s lein 测试,然后关闭服务器。 (这里我失去了在 IDE 中执行 lein 测试的便利性)

2- 我可以用固定装置检查服务器是否已启动,如果未启动则启动它。然而,在测试完成后,服务器仍将 运行ning,这是不希望的。

解决这个问题的正确方法是什么?

我可以在 clojure 中订购测试,以便最后一个测试文件关闭邮件服务器吗?

一种解决方案是使用 Java GreenMail 库。它允许您在 JVM 中启动 SMPT 邮件服务器,这使得启动、停止和检查变得容易。

以下是我使用 GreenMail 进行测试的一些片段。首先创建邮件服务器:

(def mail-setup (ServerSetup. ServerSetup/PORT_SMTP nil ServerSetup/PROTOCOL_SMTP))
(def green-mail (GreenMail. mail-setup))
(.start green-mail)
; Now the server listens on localhosts SMPT port for emails. Run your test code
; Run the code under test. Then you can receive the emails
(doseq [m (.getReceivedMessages green-mail)]
   ; Verify the emails etc
   (println "Subject: " (.getSubject m)
               " TO: " (str/join "," (.getRecipients m Message$RecipientType/TO)))
 )
; When done
(.stop green-mail)

根据您的测试,您可以在每次测试中启动和停止它。或者可以为整个测试套件保留一个测试服务器 运行。

查看 GreeMail 文档了解更多详细信息。它支持大量场景。