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):