加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Spring 3.0.x中正确测试@Async邮件程序?

发布时间:2020-12-15 01:19:06 所属栏目:大数据 来源:网络整理
导读:我有几个邮件收发器,我只想在@Async上打一下,并获得异步邮件的好处. 我唯一的问题是我不知道如何正确地测试它们,并且我想轻松地采用当前正在测试它们的方法,并在不对测试代码进行大量更改的情况下进行修改那是可能的. 例如,在测试类中,我将定义两个自动装配

我有几个邮件收发器,我只想在@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));
}

有没有很简单的方法来纠正这个问题?

最佳答案
好吧,看来这可能是解决方案.我真的不想返回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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读