Spring集成:测试异步流

时间:2015-10-06 14:13:59

标签: spring spring-integration

我试图为我向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);
}
}

这测试是否收到发送到队列的消息。该邮件由名为SubscribableChannel的{​​{1}}收到。我不清楚events如何与PollableChannel相关联。是因为SubscribableChannel吗?如果是这样,怎么样?如果这完全是偶然的,那么如果有人可以解决这个问题或者为这种情况提供一个更简单的测试用例,这将是有用的。

更新:根据评论中的建议,这是一个经过修改的测试用例:

TestMessageHandler

1 个答案:

答案 0 :(得分:1)

您的outputChannel无效。此通道是测试用例范围。所以没有人向它发送消息。

您可以使用assert

进行检查
Assert.notNull(outputChannel.receive(2000));

MessageHandler订阅了多少频道并不重要。它只处理消息。因此,它会继续处理来自您events的邮件。对内联outputChannel的绑定只是死了,对其他应用程序无关紧要。