2010-04-11 98 views
2

我的應用程序的一部分依賴於JavaMail,移動排列消息等。是否可以在不觸發IMAP服務器的情況下測試此模塊以運行測試?在測試依賴於外部服務器或模塊的東西時,我總是陷入困境。測試JavaMail相關模塊

回答

1

無法測試沒有什麼IMAP服務器,如果你的應用程序發送的電子郵件。但是,如果你正確設計你的代碼,你可以做的其他事情。你應該做的是分離你的依賴。這是什麼意思?

你的代碼應該只在一個地方訪問第三方代碼(在這種情況下是JavaMail)(大部分時間==只有一個類)。使用其餘代碼中的接口分隔此類,以便可以在測試中使用虛擬對象。

這裏有一個例子,你不應該做什麼(假設JavaMail的是外部依賴):

class Application { 
    public run(String[] receiverList, String message, String body) { 
     for (String receiver : receiverList) { 
      JavaMail.sendMessage(receiver, message, body); 
     } 
    } 
} 

您不能測試在這種情況下循環。做到這一點,而不是:

class Application { 
    private IApplicatioNMail mail; 

    public Application(IApplicationMail mail) { 
     this.mail = mail; 
    } 

    public run(String[] receiverList, String message, String body) { 
     for (String receiver : receiverList) { 
      mail.sendMessage(receiver, message, body); 
     } 
    } 
} 

class JavaApplicationMail implement IApplicationMail { 
    public sendMessage(String receiver, String message, String body) { 
     JavaMail.sendMessage(receiver, message, body); 
    } 
} 

這樣你可以創建一個虛擬(模擬,等等)在測試中,以取代JavaApplicationMail。在你的測試中,外部收入永遠不會被調用)。

的測試可能看起來類似的東西:

@Test 
public void sentThreeMails() throws Exception { 
    IApplicationMail mailCounter = new MailCounter(); 
    Application application = new Application(mailCounter); 
    application.run(new String[] { "one", "two", "three" }, "Hello", "Blah!"); 

    assertEquals(3, mailCounter.calls); 
} 

class MailCounter implements IApplicationMail { 
    public counter = 0; 

    public sendMessage(String receiver, String message, String body) { 
     counter++; 
    } 
} 
2

嘗試使用此mock爲您的測試

1

開始爲你的測試套件的IMAP服務器實際上可能是一個好主意。 GreenMail是專門爲此目的設計的,它可讓您從Java代碼運行內存中的IMAP/POP3/SMTP服務器。