2010-12-10 15 views
3

私は、@Asyncを叩いて非同期メーリングのメリットを享受したいというメーラをいくつか持っています。Spring 3.0.xで@Asyncメーラーを正しくテストするには?

私が抱える唯一の問題は、それらを正しくテストする方法がわからないことです。私が現在テストしているメソッドを簡単に取りたいだけです。それが可能であればテストコード。

たとえば、テストクラスでは、2つのautowired beanを定義します。 1つはメーラーサービスであり、メールのようなすべてのトランザクションを担当し、もう1つは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 
@Override 
public void sendRetrievePassword(UserAccount userAccount) { 
    mailSender.send(new MimeMessageSupport(velocityEngine) 
     .setTitle("Retrieve Password") 
     .setTemplate("mail/retrievePassword.vm") 
     .setToEmailAddress(userAccount.getEmailAddress()) 
     .addObject("userAccount", userAccount)); 
} 

これを修正するには、本当に簡単な方法があります:ここ

は@Asyncを使用するコードはありますか?

+1

ある場合この例では '@ Async'を使用していますか? – skaffman

+0

@skaffman:上に投稿します – egervari

答えて

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); 
} 
関連する問題