我的部分应用程序依赖于JavaMail,移动安排消息等。是否可以在不启动IMAP服务器的情况下测试此模块以运行测试?在测试依赖外部服务器或模块的东西时,我总是陷入困境。
答案 0 :(得分:2)
尝试将此mock用于测试
答案 1 :(得分:1)
如果您的应用程序发送电子邮件,那么没有IMAP服务器就无法测试的是。但是如果你正确设计你的代码,你可以做所有其他事情。你应该做的是分离你的依赖。这是什么意思?
您的代码应该只在一个地方访问第三方代码(在本例中为JavaMail)(大多数时候==只有一个类)。使用其余代码中的接口分隔此类,以便您可以在测试中使用虚拟对象。
这是一个你不应该做的例子(假设JavaMail是外部依赖):
class Application {
public run(String[] receiverList, String message, String body) {
for (String receiver : receiverList) {
JavaMail.sendMessage(receiver, message, body);
}
}
}
在这种情况下,您无法测试for循环。这样做:
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 :(得分:1)
为您的测试套件启动IMAP服务器实际上可能是个好主意。 GreenMail是为此目的而设计的,它允许您从Java代码运行内存中的IMAP / POP3 / SMTP服务器。