2013-04-23 87 views
2

我想使用Spring-Integration框架爲應用程序執行JUnit測試。我想測試:如何檢查是否或等待消息處理完成?

  • 如果消息正確的連接到如果有任何錯誤的情況下調用適當的消息錯誤處理過程我送
  • 通道服務激活處理

我正在使用JMocikt來驗證預期的方法是否被調用。我通過在消息通道上調用send開始測試。

問題是:如何等待消息處理結束?彈簧整合產生幾個線程並立即發送消息通道返回。我已經嘗試是:

  • 使用IntegrationMBeanExporter.stopActiveComponents(false, 0) - 它失敗,因爲線程中斷
  • 試圖鏈服務激活(第一:實際調用,第二:完成通知) - 它失敗,因爲該服務激活在測試中返回null在這種情況下,它不能被鏈接。另外,我不喜歡它,因爲我必須在測試中改變SI配置。

任何線索?

請不要評論不執行真正的單位,但集成測試等。我知道我在做什麼。

回答

4

測試用例中最常用的技術是用QueueChannel代替最終通道,將其注入測試用例並執行assertNotNull(finalChannel.receive(5000)。您甚至可以測試收到的消息以驗證它包含預期的數據。

當您使用異步處理並且最終服務沒有返回結果(或null)時,它會更棘手。在這種情況下,您可以將最終頻道設置爲<publish-subscribe-channel/>,並在您的測試用例中添加第二個用戶(具有更高的order屬性),例如<bridge/>QueueChannel,然後結果如上。

+0

順序屬性是否使順序執行? – Marcin 2013-04-23 14:59:15

+0

默認情況下使用解析順序;我傾向於爲每個用戶1,2,3等添加明確的訂單屬性。如果只有一個用戶,它就不會受到傷害,並且它意圖清晰。只要''沒有多線程任務執行程序,就會按順序調用它們。默認情況下,將在發送到通道的線程上順序調用每個訂閱者。 – 2013-04-23 17:35:24

+0

您的回答非常有幫助,謝謝。我仍然有一個問題,事實是,錯誤通道是(據我所知)只用於異步調用。這給測試過程帶來了很大的變化。 – Marcin 2013-04-24 11:23:01