Java 如何检查或等待消息处理完成?
我想使用Spring集成框架对应用程序执行JUnit测试。我想测试的是:Java 如何检查或等待消息处理完成?,java,spring-integration,jmockit,Java,Spring Integration,Jmockit,我想使用Spring集成框架对应用程序执行JUnit测试。我想测试的是: 如果连接到我正在发送的通道的service activator正确处理了消息 如果出现任何错误,是否调用了正确的消息错误处理过程 我使用JMocikt来验证是否调用了预期的方法。我通过在消息通道上调用send来启动测试 问题是:如何等待消息处理结束?Spring集成产生多个线程,并在消息通道上发送消息,立即返回。我已经尝试过的是: 使用IntegrationMBeanExporter.stopActiveCompon
- 如果连接到我正在发送的通道的service activator正确处理了消息
- 如果出现任何错误,是否调用了正确的消息错误处理过程
send
来启动测试
问题是:如何等待消息处理结束?Spring集成产生多个线程,并在消息通道上发送消息,立即返回。我已经尝试过的是:
- 使用
-由于线程中断而失败IntegrationMBeanExporter.stopActiveComponents(false,0)
- 尝试链接服务激活器(第一个:实际调用,第二个:完成通知)-它失败,因为测试中的服务激活器返回
,在这种情况下,它无法链接。另外,我不喜欢它,因为我必须改变测试中的SI配置null
请不要评论不执行真正的单元,而是集成测试等。我知道我在做什么。测试用例中使用的最常用技术是用
队列通道替换最终通道,将其注入测试用例并执行assertNotNull(finalChannel.receive(5000)
。您甚至可以测试收到的消息,以验证它是否包含预期的数据
当您使用异步处理且最终服务不返回结果(或null
)时,这有点棘手。在这种情况下,您可以将最终通道设为
,并在测试用例中添加第二个订户(具有更高的顺序
属性),例如一个
到一个队列通道
,然后接收()
上面的结果。测试用例中最常用的技术是用队列通道
替换最后一个通道,将其注入测试用例并执行assertNotNull(finalChannel.receive(5000)
。您甚至可以测试收到的消息,以验证它是否包含预期的数据
当您使用异步处理且最终服务不返回结果(或null
)时,这有点棘手。在这种情况下,您可以将最终通道设为
,并在测试用例中添加第二个订户(具有更高的顺序
属性),例如将
发送到队列通道,然后发送接收()
如上所述的结果。order属性是否使执行顺序有序?默认情况下使用解析顺序;我倾向于为每个订阅服务器1、2、3等添加一个显式的order属性。如果只有一个订阅服务器,这不会造成任何伤害,并且它可以清楚地表明意图。只要
不存在,它们将按顺序调用ave一个多线程任务执行器。默认情况下,每个订阅服务器将在发送到通道的线程上按顺序调用。您的回答非常有用,谢谢。我仍然存在的一个问题是,错误通道是(据我所知)仅用于异步调用。这将对测试过程进行重大更改。否;错误通道也用于同步流。我们应该将其移动到聊天室-因此不打算用作讨论板。order属性是否使执行顺序连续?默认情况下使用解析顺序;我倾向于添加显式order属性分配给每个订阅服务器1、2、3等。如果只有一个订阅服务器,则不会有任何影响,并且它明确了目的。只要
没有多线程任务执行器,就会按顺序调用这些订阅服务器。默认情况下,每个订阅服务器都会在发送到频道的线程上按顺序调用。您的答案非常正确lpful,谢谢。我还有一个问题,就是错误通道(据我所知)仅用于异步调用。这对测试过程带来了很大的变化。不;错误通道也用于同步流。我们应该将其转移到聊天室,因此不打算用作讨论板。