2009-06-22 60 views
29

我想在一些模型類上運行單元測試(Junit),這些模型類通常會發送確認事情發生的電子郵件。是否有一個模擬電子郵件服務器,您可以使用單元測試,讓您確認您的運行試圖發送電子郵件,而不實際發送電子郵件出?運行Junit電子郵件測試沒有電子郵件實際上走出

這似乎是一個很高興有,只是不知道我想寫我自己的。用於電子郵件方面的應用程序堆棧是Velocity + Spring,因此如果可以通過簡單地更改applicationContext.xml文件來指向測試服務器,那麼這將更好。

+0

檢查我的答案http://stackoverflow.com/questions/8599791/a-simple-local-smtp-server/22043597#22043597 – 2014-03-03 15:15:45

回答

27

替代答案:Dumbster是一個虛擬的SMTP服務器,專門用於測試。它是用Java編寫的。

+4

+1,儘管SubEthaSMTP可能比Dumbster更容易使用。 – 2009-06-22 14:53:26

+0

這正是我所要求的。我現在要使用它,我可能會轉而在某個時候使用模擬對象來加速測試。 – stevedbrown 2009-06-22 17:42:41

+1

只需要一個筆記 - 使用Dumbster運行,我的單元測試需要大約500毫秒來啓動服務器,發送電子郵件並測試電子郵件是否已發送。這比我需要年齡的Jersey框架測試要好得多。 – stevedbrown 2009-06-22 18:36:42

14

我認爲Mock JavaMail項目是你想要的。

+0

絕對 - 永不模擬出一個第三方接口自己,這是很少值得的時間。 (如果你想 - 使用PowerMock)。但在這種情況下,只需放下模擬JavaMail,並且神奇地將所有消息保存在模擬郵箱中供您檢查和斷言。簡單而有效(只是讓它脫離你的生產類路徑!) – Phantomwhale 2010-04-19 13:18:56

+0

有一個快速入門:http://ollivander.franzoni.eu/2011/08/30/mock-javamail-primer/ – jediz 2013-06-11 13:54:57

+1

鏈接的網站已關閉。 – holmis83 2017-08-17 09:10:20

0

我的解決方案是將郵件服務器封裝在一個具有所有配置選項並具有send()方法的類中。在我的測試中,我會嘲笑這個類,並用保存斷言的當前參數的東西覆蓋send()

要測試郵件服務本身是否正常工作,請在本地發送郵件。如果您在Windows上,請嘗試hMail

+0

我在Windows上開發,但我在Ubuntu上運行持續集成服務器,因此無法工作。 – stevedbrown 2009-06-22 14:53:27

+0

當然;使用地址「localhost」或「127.0.0.1」,並在Windows上爲郵件添加與Ubunutu相同的帳戶。我不確定Ubuntu使用了什麼,但它已經安裝了郵件服務器。可能是qmail或postfix。 – 2009-06-22 15:06:20

3

我假設你使用Javamail,問題是javax.mail.Session是最終的,因此不能被嘲笑。

像其他人似乎建議你只需定義自己的'郵件會話'界面,並創建一個使用Javamail的實現。在您的測試中,您只需在'真實世界模式'中注入模擬,然後注入Javamail實現。

JMock和EasyMock都支持您可能想要對您發送的郵件進行的所有聲明,並且您的測試已完成。另外,我通常會盡量避免單元測試中的任何進程外調用 - 當您頻繁地運行測試套件時,它會殺死您,這通常會轉化爲運行更少,並且代碼庫問題開始出現。

+0

這真的是一個很好的評論,讓我想到更多的方法。我正在考慮產生一個進程,但更有可能的是,我應該在我的spring config xml中實例化一個嘲笑電子郵件服務器的bean。 – stevedbrown 2009-06-22 15:45:40

+0

嗨史蒂夫 - 這就是要點。如果你突然有另一個進程作爲你的終點運行,那麼斷言變得很難,所以你的測試最終只會確保你不會從另一個進程中得到錯誤,這可能與其他進程不一樣將被用於憤怒,所以真的是一個靜音測試 - 畢竟我認爲它是安全的假設Javamail的工作;-)嘲笑的做法可以讓你驗證消息的內容,我認爲這是真正的考驗.... – 2009-06-22 15:58:30

1

您可以嘗試的JavaMail Mock2 https://github.com/salyh/javamail-mock2

它主要側重於IMAP/POP3 SMTP,但莫克也是可用的。它在Maven中心提供。

特點

  • 支持IMAP,IMAPS,POP3,POP3S,SMTP,SMTPS
  • 支持POP3的:投給POP3Folder,Folder.getUID(消息MSG)支持
  • 爲IMAP:澆鑄到IMAPFolder,轉換爲UIDFolder,子文件夾,-Folder.getMessagesByUID(...),刪除/重命名文件夾,消息附加
  • 支持SMTP:模擬Transport.send()
  • 不支持的時刻:IMAP的擴展名如IDL E,CONDSTORE,...並投到POP3Message/IMAPMessage,店鋪聽衆