2013-04-23 46 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