我有几个邮件,我只是喜欢打击@Async并获得异步邮件的好处。
我遇到的唯一问题是我不知道如何正确测试它们,我想轻松采用我目前正在测试它们的方法,并且只需修改它而不需要对其进行大量更改如果可能的话,测试代码。
例如,在测试类中,我将定义两个自动装配的bean。一个是邮件服务,负责执行所有类似邮件的事务,另一个是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));
}
有没有一种非常简单的方法可以解决这个问题?
答案 0 :(得分:3)
嗯,似乎这可能是解决方案。我真的不想返回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);
}