[英]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);
}
}
這測試發送到隊列的消息是否已收到。 該消息由名為events
的SubscribableChannel
接收。 我不清楚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.