2015-10-06 103 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集成這樣的異步的東西?看起來必須有某種方式來轉移「事件」流並檢查收到的消息。 –