У меня есть несколько почтовых программ, на которые я бы хотел добавить @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));
}
Есть ли действительно простой способ исправить это?