簡體   English   中英

Spring集成:測試異步流

[英]Spring integration : testing async flows

我正在嘗試為一個場景編寫測試用例,在該場景中,我向JMS端點發送消息,然后使用Spring Integration處理消息。 這是一個有效的測試用例,但對我來說尚不十分清楚它為什么起作用。 這是測試:

public class MessageListenerTest {

@Autowired ApplicationContext context;
@Test
public void testEventListener() {
    SubscribableChannel eventsChannel = (SubscribableChannel) context.getBean("events");
    class TestMessageHandler implements MessageHandler {
        public Boolean received = false;
        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            received = true;
        } 
    }
    TestMessageHandler handler = new TestMessageHandler();
    eventsChannel.subscribe(handler);
    PollableChannel outputChannel = new QueueChannel();
    PollingConsumer consumer = new PollingConsumer(outputChannel, handler);
    consumer.setBeanFactory(context);
    consumer.start();
    String msg = "hello world!";
    JmsTemplate template = (JmsTemplate) context.getBean("jmsTemplate");
    template.convertAndSend("myQueue", msg);
    outputChannel.receive(2000);
    Assert.assertTrue(handler.received);
}
}

這測試發送到隊列的消息是否已收到。 該消息由名為eventsSubscribableChannel接收。 我不清楚PollableChannel是如何連接到SubscribableChannel 是因為TestMessageHandler嗎? 如果是這樣,怎么辦? 如果這完全是偶然發生的,那么有人可以對此問題進行修復或提供一個更簡單的測試用例將很有用。

更新 :根據注釋中的建議,這是修改后的測試用例:

public class MessageListenerTest {

@Autowired ApplicationContext context;

@Test
public void testEventListener() throws InterruptedException {
    SubscribableChannel eventsChannel = (SubscribableChannel) context.getBean("events");
    final CountDownLatch countDownLatch = new CountDownLatch(1);
    MessageHandler handler = new MessageHandler() {
        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            countDownLatch.countDown();
        } 
    };
    eventsChannel.subscribe(handler);
    String msg = "hello world!";
    JmsTemplate template = (JmsTemplate) context.getBean("jmsTemplate");
    template.convertAndSend("myQueue", msg);
    Assert.assertTrue(countDownLatch.await(2, TimeUnit.SECONDS));
}
}

您的outputChannel無法正常工作。 該通道是一個測試用例范圍。 因此沒有人向它發送消息。

您可以使用assert來檢查:

Assert.notNull(outputChannel.receive(2000));

MessageHandler訂閱了多少通道都沒有關系。 它只是處理消息。 因此,它將繼續處理來自您的events消息。 並且與該內聯outputChannel的綁定只是無效的,對於其他應用程序無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM