0

私はこのようなJMSサービスの統合テストを作成しようとしています。JMS統合テスト

@JmsListener(destination = "mailbox", containerFactory = "myFactory") 
public void receiveMessage(Email message) throws InterruptedException { 
    try { 
     sendEmail(message); 
    }catch (Exception e){ 
     LOGGER.log(Level.SEVERE,"Failed to deliver email",e); 
     Thread.sleep(TimeUnit.SECONDS.toSeconds(Optional.of(retryInterval).orElse(5))); 
     throw e; 
    } 
} 

private void sendEmail(Email message){ 
    ............... 
} 

まず、私はこれをどうやって模擬することができますか?私はそれを嘲笑しようとしましたが、メッセージを送信すると、春の起動アプリケーションは実際のJMS Beanを模擬スレッドではなく呼び出しています。このようなことはできないようです。 これが不可能であっても、少なくとも私はbeanを返すことができ、何らかの形でreceiveMessageメソッドが呼び出されているかどうかを確認できます。さらに、それが呼び出されている場合、sendEmailの部分は、何の仕事もしないように偽造されるべきです。私は、テスト用のサブクラスを作成するなどのいくつかのアイデアを持っていますが、いずれかに満足していません。あなたが私にもっと良い仕事を提案できるかどうかを知りたいですか?

答えて

0

1つのアプローチは、開発、統合テスト、生産のために異なるプロファイルを使用し、それに応じて異なるコンポーネントと統合テストクラスに注釈を付けることです。

@Component 
@Profile("it") 
public class MessageReceiverIT { 

    @JmsListener(destination = "mailbox", containerFactory = "myFactory") 
    public void receiveMessage(SimpleMessage email) { 
     log.info("Integration test pretend to receive {}", email); 
// (...) 

これは、実際のアプリケーションと同じアプリケーションクラスを使用して統合テストであるが、メッセージが受信された場合MessageReceiverIT.receiveMessage()方法は、製造部品の代わりに呼び出される。

@RunWith(SpringRunner.class) 
@SpringBootTest(classes=Application.class) 
@ActiveProfiles("it") 
public class JmsIntegrationTest { 

    @Inject 
    ConfigurableApplicationContext context; 

    @Test 
    public void testSend() throws Exception{ 
     JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); 
     jmsTemplate.convertAndSend("mailbox", new SimpleMessage("it", "we need more IT")); 
// (...) 

またチェック@TestConfigurationの使用のような別のアプローチの場合はSpring Boot Testingです。私は私の例ではSpring Bootを使用していますが、Spring Boot Applicationがない場合は同様の方法が必要です。

+0

実際、私は同様のアプローチを使用し、メモリメッセージングキューと同様にアクティブなmqを使用しました。 2つのプロファイルを作成し、私がinitのやり方を違うところからテストしてprodします。 – Imran