2010-04-11 95 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服务器。