我想使用 Spring-Integration 框架对应用程序执行 JUnit 测试。我要测试的是:
- 连接到我发送的 channel 的服务激活器是否正确处理了消息
- 如果出现任何错误,是否调用了正确的消息错误处理程序
我正在使用 JMocikt 来验证是否调用了预期的方法。我通过在消息 channel 上调用 send
来开始测试。
问题是:如何等待消息处理结束? Spring 集成生成多个线程,并在消息 channel 上发送立即返回。我已经尝试过的是:
- 使用
IntegrationMBeanExporter.stopActiveComponents(false, 0)
- 由于线程中断而失败 - 尝试链接服务激活器(第一个:实际调用,第二个:完成通知) - 它失败,因为测试中的服务激活器返回
null
在这种情况下,它无法链接。另外,我不喜欢它,因为我必须更改测试下的 SI 配置。
有什么线索吗?
请不要评论不执行实际单元,而是集成测试等。我知道我在做什么。
最佳答案
测试用例中最常用的技术是将最终 channel 替换为 QueueChannel
,将其注入(inject)到测试用例中并执行assertNotNull(finalChannel.receive(5000)
。您甚至可以测试收到的消息以验证它包含预期的数据。
当您使用异步处理并且最终服务不返回结果(或 null
)时,这就有点棘手了。在这种情况下,您可以将最终 channel 设为 <publish-subscribe-channel/>
并且,在您的测试用例中,添加第二个订阅者(具有更高的 order
属性),例如 <bridge/>
到 QueueChannel
,然后 receive()
结果如上。
关于java - 如何检查或等待消息处理完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16168250/