Mule FunctionalTestComponent事件回调-从未收到事件

Mule FunctionalTestComponent事件回调-从未收到事件,mule,Mule,我试图使用FunctionalTestComponent捕获Mule中的消息,以便在流中针对某些头属性进行断言。但事件从未被接收,我的测试总是在应该失败的地方通过。如何配置测试以捕获事件?以下是我的测试方法: @Test public void testCallback() throws Exception { FunctionalTestComponent ftc = getFunctionalTestComponent("test"); ftc.setEventCallba

我试图使用
FunctionalTestComponent
捕获Mule中的消息,以便在流中针对某些头属性进行断言。但事件从未被接收,我的测试总是在应该失败的地方通过。如何配置测试以捕获事件?以下是我的测试方法:

@Test
public void testCallback() throws Exception {

    FunctionalTestComponent ftc = getFunctionalTestComponent("test");
    ftc.setEventCallback(new EventCallback()
    {
       public void eventReceived(MuleEventContext context, Object component)
           throws Exception
       {
             assertTrue(false);
             System.out.println("Thanks for calling me back");
       }
     });

     MuleClient client = muleContext.getClient();
     MuleMessage reply = client.send("vm://test", TEST_MESSAGE, null, 5000);
}
配置只有两个流,第二个流中有一个test:component,由vm://test流引用

我能让它工作的唯一方法是使用闩锁和
AtomicReference
保存MuleMessage,这样我就可以在
muleClient.send
之后运行断言

FunctionalTestComponent ftc = getFunctionalTestComponent("test");

      final CountDownLatch latch = new CountDownLatch(1);
      final AtomicReference<MuleMessage> message = new AtomicReference<MuleMessage>();

      EventCallback callback = new EventCallback() {
         public void eventReceived(MuleEventContext context, Object component)
               throws Exception {
            if (1 == latch.getCount()) {
               message.set(context.getMessage());
               System.out.println("1111");
               latch.countDown();
            }
         }
      };

      ftc.setEventCallback(callback);
      MuleClient client = muleContext.getClient();
      client.send("vm://test", TEST_MESSAGE, null);
      latch.await(10, TimeUnit.SECONDS);
      MuleMessage msg = (MuleMessage) message.get();
FunctionalTestComponent ftc=getFunctionalTestComponent(“测试”);
最终倒计时闩锁=新倒计时闩锁(1);
最终AtomicReference消息=新的AtomicReference();
EventCallback callback=新的EventCallback(){
接收到公共void事件(MuleEventContext上下文、对象组件)
抛出异常{
如果(1==lack.getCount()){
message.set(context.getMessage());
系统输出打印项次(“1111”);
倒计时();
}
}
};
ftc.setEventCallback(回调);
MuleClient client=muleContext.getClient();
发送(“vm://test”,test\u消息,空);
等待(10,时间单位秒);
MuleMessage msg=(MuleMessage)message.get();

第二个流是异步调用的吗?不是。它只是一个同步流,有一个http入站端点,后跟一个测试:Component然后我不明白,我一直使用与您类似的代码,它工作正常,
eventReceived
被调用。我知道这很奇怪。如果我在eventreceived中添加一个断言,它就不会像预期的那样工作。我已经更新了我的答案,以显示我是如何让它工作的。但是我必须使用闩锁和原子引用来存储MuleMessage,以便在muleClient.send之后运行断言(…你认为这可能是一个计时问题吗?因为我的测试以muleClient.send结束(…那么测试在接收事件之前就结束了吗?不,问题是事件中的断言对测试本身没有任何影响,因为它们是由Mule线程而不是测试线程运行的。使用闩锁/原子引用是将消息带回测试线程的常见模式,您做得很好。请注意,Mule有一个闩锁助手clas这只是一个倒计时锁(1):