Подтвердить что ты не робот

Каков самый простой способ издеваться над IMAP или POP-сервером для модульных тестов?

Я хочу unit test приложение Java, которое извлекает письма из почтового ящика электронной почты, как этого парня. В настоящее время я запускаю модульные тесты против реального почтового ящика на нашем почтовом сервере нашей компании, который был прост в настройке, но имеет следующие недостатки:

  • Вы должны отправить фактические электронные письма перед тем, как запустить тест.
  • Добавление дополнительных тестовых примеров может быть затруднено, например, потому что вы можете протестировать разные политики безопасности.
  • Тест зависит от рабочего сетевого подключения к почтовому серверу и существующей почтовой учетной записи, которая сочетает развитие и системное администрирование таким образом, что для меня нет смысла.

Я хотел бы запустить IMAP-сервер на локальном порту, который подделывает почтовый ящик на основе тестовых данных, хранящихся в файлах вместе с тестовыми классами. Я могу думать о следующих подходах:

  • Запустите сервер сокетов и выполните рудиментарное подмножество IMAP
  • Используйте библиотеку более высокого уровня, созданную для создания почтовых серверов.
  • Используйте существующую реализацию сервера электронной почты, которую я могу встроить в свои тесты.

Я бы хотел избежать первого варианта, это выглядит просто, но я полагаю, что из-за подобного опыта есть длинный хвост работы, ожидающий дальнейшего продвижения по дороге. Просто подумайте о необходимости тестирования безопасных подключений и т.д. Аналогичным образом второй вариант, похоже, очень много работает, но я еще не нашел почтовый сервер, который позволит использовать третий.

Если это имеет значение, я использую Maven и TestNG во время процесса сборки.

4b9b3361

Ответ 1

Greenmail может оказаться полезным.

GreenMail - это открытый, интуитивно понятный и простой в использовании набор тестов почтовых серверов для тестирования. Поддерживает SMTP, POP3, IMAP с поддержкой сокетов SSL.

Ответ 2

Напишите тест, который опирается на существующий почтовый сервер, чтобы проверить, может ли ваш код получить к нему доступ. Этот код должен выполнить правильную настройку (т.е. Он должен отправить себе почту). Защитите этот тест с помощью некоторой глобальной переменной или System.property, чтобы вы могли включить/отключить ее во время выполнения.

Переместите код для доступа к серверу в изолированный класс.

Переопределите этот класс в своих тестах. В тесте просто проверьте правильность текста почты. Если вы получаете сообщение об ошибке, что доступ к серверу не работает, включите "доступ к реальному серверному тесту" и проверьте.

Ответ 3

Я бы предложил встроить чистый Java IMAP/POP-сервер в ваш тестовый код.

Для этого у вас есть множество возможностей, в том числе:

  • Напишите свой собственный IMK-макет с помощью Javamail
  • Использовать Dwarf mail server
  • Используйте JMock для эмуляции различных интерфейсов вашего почтового сервера (в конце концов, он должен иметь интерфейс, нет?)

Ответ 4

Проект Mock-JavaMail

Я столкнулся с этим при разработке плагина для Jenkins, и это был сон для использования!

Просто отмените зависимость в своем проекте, и вы готовы к работе (я позволю Kohsuke объясняет, как настроить и использовать его).

Если вы нетерпеливы, вот краткий пример того, как он используется:

Пример:

// Setup test: add mail to inbox
Mailbox tmp = Mailbox.get("[email protected]");
tmp.add(/* your javax.mail.Message */)
assertEquals 1, tmp.size()

// Connect to the inmemory mailbox using "imap"
Session session = Session.getInstance(System.getProperties(), null);
Store store = session.getStore('imap');
store.connect("bar.com","foo","anything");

// Check the mail exists!
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
assertEquals 1, inbox.getMessageCount()
store.close();