2010-12-10 61 views
3

我有几个邮件程序,我会很喜欢拍打@Async并获得异步通讯的好处。如何在Spring 3.0.x中正确测试@Async邮件程序?

我遇到的唯一问题是,我不知道如何正确地测试他们,我想轻松拍摄方法我目前正在测试它们,只是修改它,而无需对巨大变化测试代码如果可能的话。

例如,在一个测试类,我会定义两个自动装配Autowired豆类。一个是邮件服务,负责完成所有类似邮件的事务,另一个是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

在哪里你在这个例子中使用'@ Async'? – skaffman 2010-12-10 20:19:54

+0

@skaffman:我会在上面张贴它 – egervari 2010-12-10 21:50:50

回答

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); 
} 
相关问题