2010-12-10 24 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); 
}