测试JavaMail相关模块

时间:2010-04-11 13:41:04

标签: java unit-testing javamail

我的部分应用程序依赖于JavaMail,移动安排消息等。是否可以在不启动IMAP服务器的情况下测试此模块以运行测试?在测试依赖外部服务器或模块的东西时,我总是陷入困境。

3 个答案:

答案 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服务器。