Spring 集成:测试异步流程

Spring integration : testing async flows

我正在尝试为我向 JMS 端点发送消息然后使用 Spring 集成处理消息的场景编写测试用例。这是一个有效的测试用例,但我不完全清楚它为什么有效。这是测试:

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吗?如果是这样,如何?如果这完全是偶然的,如果有人可以解决这个问题或为这个场景提供一个更简单的测试用例,那将会很有用。

UPDATE:根据评论中的建议,修改测试用例:

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 只是死了,对其他应用程序无关紧要。