Java 如何检查或等待消息处理完成?

Java 如何检查或等待消息处理完成?,java,spring-integration,jmockit,Java,Spring Integration,Jmockit,我想使用Spring集成框架对应用程序执行JUnit测试。我想测试的是: 如果连接到我正在发送的通道的service activator正确处理了消息 如果出现任何错误,是否调用了正确的消息错误处理过程 我使用JMocikt来验证是否调用了预期的方法。我通过在消息通道上调用send来启动测试 问题是:如何等待消息处理结束?Spring集成产生多个线程,并在消息通道上发送消息,立即返回。我已经尝试过的是: 使用IntegrationMBeanExporter.stopActiveCompon

我想使用Spring集成框架对应用程序执行JUnit测试。我想测试的是:

  • 如果连接到我正在发送的通道的service activator正确处理了消息
  • 如果出现任何错误,是否调用了正确的消息错误处理过程
我使用JMocikt来验证是否调用了预期的方法。我通过在消息通道上调用
send
来启动测试

问题是:如何等待消息处理结束?Spring集成产生多个线程,并在消息通道上发送消息,立即返回。我已经尝试过的是:

  • 使用
    IntegrationMBeanExporter.stopActiveComponents(false,0)
    -由于线程中断而失败
  • 尝试链接服务激活器(第一个:实际调用,第二个:完成通知)-它失败,因为测试中的服务激活器返回
    null
    ,在这种情况下,它无法链接。另外,我不喜欢它,因为我必须改变测试中的SI配置
有什么线索吗


请不要评论不执行真正的单元,而是集成测试等。我知道我在做什么。

测试用例中使用的最常用技术是用
队列通道替换最终通道,将其注入测试用例并执行
assertNotNull(finalChannel.receive(5000)
。您甚至可以测试收到的消息,以验证它是否包含预期的数据


当您使用异步处理且最终服务不返回结果(或
null
)时,这有点棘手。在这种情况下,您可以将最终通道设为
,并在测试用例中添加第二个订户(具有更高的
顺序
属性),例如一个
到一个
队列通道
,然后
接收()
上面的结果。

测试用例中最常用的技术是用
队列通道
替换最后一个通道,将其注入测试用例并执行
assertNotNull(finalChannel.receive(5000)
。您甚至可以测试收到的消息,以验证它是否包含预期的数据


当您使用异步处理且最终服务不返回结果(或
null
)时,这有点棘手。在这种情况下,您可以将最终通道设为
,并在测试用例中添加第二个订户(具有更高的
顺序
属性),例如将
发送到
队列通道,然后发送
接收()
如上所述的结果。

order属性是否使执行顺序有序?默认情况下使用解析顺序;我倾向于为每个订阅服务器1、2、3等添加一个显式的order属性。如果只有一个订阅服务器,这不会造成任何伤害,并且它可以清楚地表明意图。只要
不存在,它们将按顺序调用ave一个多线程任务执行器。默认情况下,每个订阅服务器将在发送到通道的线程上按顺序调用。您的回答非常有用,谢谢。我仍然存在的一个问题是,错误通道是(据我所知)仅用于异步调用。这将对测试过程进行重大更改。否;
错误通道也用于同步流。我们应该将其移动到聊天室-因此不打算用作讨论板。order属性是否使执行顺序连续?默认情况下使用解析顺序;我倾向于添加显式order属性分配给每个订阅服务器1、2、3等。如果只有一个订阅服务器,则不会有任何影响,并且它明确了目的。只要
没有多线程任务执行器,就会按顺序调用这些订阅服务器。默认情况下,每个订阅服务器都会在发送到频道的线程上按顺序调用。您的答案非常正确lpful,谢谢。我还有一个问题,就是错误通道(据我所知)仅用于异步调用。这对测试过程带来了很大的变化。不;
错误通道也用于同步流。我们应该将其转移到聊天室,因此不打算用作讨论板。