1
我正在尝试编写一个测试用例,在该测试用例中,我向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);
}
}
这测试发送到队列的消息被接收。该消息由名为events
的SubscribableChannel
接收。我不清楚的是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));
}
}
谢谢Artem。我确实怀疑过,但如果我删除了与'outputChannel'有关的所有内容,则测试失败。投票消费者的存在是否提供了允许测试通过的某种阻塞? –
是的,你的应用程序是'async',你的'outputChannel.receive(2000)'只是阻塞测试2秒。如果您的消息通过JMS表单更长的时间,您的测试将再次失败。 –
谢谢。看起来像一个'Thread.sleep()'也会起作用。有没有推荐的方法来测试Spring集成这样的异步的东西?看起来必须有某种方式来转移“事件”流并检查收到的消息。 –