Тестирование связанных с JavaMail модулей - PullRequest
2 голосов
/ 11 апреля 2010

Часть моего приложения зависит от JavaMail, перемещения сообщений и т. Д. Можно ли протестировать этот модуль без запуска IMAP-сервера для запуска тестов? Я всегда зацикливаюсь на тестировании, которое зависит от внешних серверов или модулей.

Ответы [ 3 ]

2 голосов
/ 11 апреля 2010

Попробуйте использовать этот макет для теста

1 голос
/ 11 апреля 2010

Запуск IMAP-сервера для вашего набора тестов может быть хорошей идеей. GreenMail был разработан специально для этой цели, он позволяет запускать IMAP / POP3 / SMTP-серверы в памяти из кода Java.

1 голос
/ 11 апреля 2010

То, что вы не можете проверить без сервера 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++;
    }
}
...