Как правильно протестировать почтовые программы @Async в Spring 3.0.x? - PullRequest
3 голосов
/ 10 декабря 2010

У меня есть несколько почтовых программ, на которые я бы хотел добавить @Async и воспользоваться преимуществами асинхронной рассылки.

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

Например, в тестовом классе я определю два бина с автоматическим подключением. Одним из них является почтовый сервис, который отвечает за выполнение всех почтовых транзакций, а другим - JavaMailSender, но это неважно. Затем я помещаю макет в сервис, чтобы он не отправлял настоящие электронные письма;)

@Autowired
Mailer mailer;

MockJavaMailSender mailSender;

@Before
public void setup() {
    mailSender = new MockJavaMailSender();
    mailer.setMailSender(mailSender);
}

Этот подход сработал очень хорошо, потому что я могу просто задать свои ложные вопросы или получить от него данные, чтобы убедиться, что мой почтовый код работает:

UserAccount userAccount = userAccountDao.find(1);

mailer.sendRetrievePassword(userAccount);

mailSender.assertTimesSent(1);
String text = mailSender.getMimeMessage().buildText();

// Do tests on text.

Проблема с @Async заключается в том, что mailSender еще не будет заполнен, поэтому тесты не пройдут.

вот код, который использует @Async:

@Async
@Override
public void sendRetrievePassword(UserAccount userAccount) {
    mailSender.send(new MimeMessageSupport(velocityEngine)
        .setTitle("Retrieve Password")
        .setTemplate("mail/retrievePassword.vm")
        .setToEmailAddress(userAccount.getEmailAddress())
        .addObject("userAccount", userAccount));
}

Есть ли действительно простой способ исправить это?

1 Ответ

3 голосов
/ 11 декабря 2010

Ну, похоже, это может быть решением.Я на самом деле не хочу возвращать сообщение MIME, так как мое приложение не нуждается ... но оно работает:

@Async
@Override
public Future<MimeMessageSupport> sendRetrievePassword(UserAccount userAccount) {
    MimeMessageSupport mimeMessage = new MimeMessageSupport(velocityEngine)
        .setTitle("Retrieve Password")
        .setTemplate("mail/retrievePassword.vm")
        .setToEmailAddress(userAccount.getEmailAddress())
        .addObject("userAccount", userAccount);

    mailSender.send(mimeMessage);

    return new AsyncResult<MimeMessageSupport>(mimeMessage);
}

И вот тест для его прохождения:

@Test
public void sendRetrievePassword() throws ExecutionException, InterruptedException {
    UserAccount userAccount = userAccountDao.find(1);

    Future<MimeMessageSupport> future = mailer.sendRetrievePassword(userAccount);

    String text = future.get().buildText();

    assertTrue(text.contains(userAccount.getEmailAddress()));
    assertTrue(text.contains(userAccount.getPassword()));

    mailSender.assertTimesSent(1);
}
...