如何在Spring 3.0.x中正确测试@Async邮件程序?
我有几个邮件程序,我只是想打@Async并享受异步邮件的好处。
我遇到的唯一问题是我不知道如何正确地测试它们,并且我想轻松地采用我正在测试它们的方法,只是修改它而不对测试代码进行大量更改if这是可能的。
例如,在一个测试类中,我将定义两个自动布线的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));
}
有没有一个真正简单的方法来纠正这个问题?
那么,这似乎可能是解决方案。 我真的不想返回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);
}
链接地址: http://www.djcxy.com/p/93487.html