2015-10-06 141 views
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); 
} 
} 

这测试发送到队列的消息被接收。该消息由名为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)); 
} 
} 

回答

1

outputChannel是行不通的。此通道是一个测试用例范围。所以没有人发送消息给它。

您可以检查与assert

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

不要紧为MessageHandler多少通道被认购。它只是处理消息。因此,它会继续处理来自events的消息。并且绑定到该内联outputChannel只是已经死了,并不关心其他应用程序。

+0

谢谢Artem。我确实怀疑过,但如果我删除了与'outputChannel'有关的所有内容,则测试失败。投票消费者的存在是否提供了允许测试通过的某种阻塞? –

+0

是的,你的应用程序是'async',你的'outputChannel.receive(2000)'只是阻塞测试2秒。如果您的消息通过JMS表单更长的时间,您的测试将再次失败。 –

+0

谢谢。看起来像一个'Thread.sleep()'也会起作用。有没有推荐的方法来测试Spring集成这样的异步的东西?看起来必须有某种方式来转移“事件”流并检查收到的消息。 –