使用MockEndpoints测试骆驼

问题描述:

我有一系列“流水线”组件,都通过ActiveMQ消息队列进行通信。每个组件使用Camel将这些队列中的每一个作为端点处理。每个组件使用相同的基本模式:使用MockEndpoints测试骆驼

Basic component pattern

其中每个组件使用消息关的输入队列的,处理该消息(一个或多个),然后放置1 +上的出站/输出队列中的消息。 “输出”队列然后成为链中下一个组件的“输入”队列。很基本。

我现在试图卷起袖子,并使用Camel的测试API提供的MockEndpoints为每个组件提供单元测试。我一直在浏览骆驼网站上的javadoc和几个例子,但是难以连接所有的点。

在我看来,对于每个部件,我的单元测试的一部分将要完成以下三件事情:

  • 测试,看看是否有正在等待一个特定消息的“输入“队列
  • 拉下这些消息并处理它们
  • 推送新邮件到‘输出’的队列,并验证他们把它存在

是lieve我需要为每个队列创建MockEndpoints像这样:

@EndpointInject(uri = "mock:inputQueue") 
protected MockEndpoint intputQueue; 

@EndpointInject(uri = "mock:outputQueue") 
protected MockEndpoint outputQueue; 

所以现在,在我的JUnit测试方法,我可以设置期望,并与这些端点进行交互:

@Test 
public final void processMethodShouldSendToOutputQueue() 
{ 
    Component comp = new Component(); 
    comp.process(); 

    outputQueue.assertIsSatisfied(); 
} 

我只是不理解如何连接一切正常:

  • 如何连接compinputQueueoutputQueue个MockEndpoints?
  • 对于每个MockEndpoint,我如何设置期望以便assertIsSatisfied()检查消息是否存在于特定队列中,或者特定队列是否包含消息?
+0

的http://计算器。 com/questions/5664331/how-to-unit-test-production-routes-in-apache-camel – 2011-12-20 19:53:45

亚当,有几种方法可以做到这一点。

对于POJO组件,blackbox将它们与任何Camel环境/路由分开进行测试,以专注于业务逻辑。

如果您想对路由进行端到端测试,请考虑使用以下方法之一来验证路由中的每个步骤都已满足。

  • 使用NotifyBuilder建立交易所验证表达式(有点复杂,让你的头部周围)
  • 使用AdviceWith其运行之前,动态改变路线(添加日志/模拟终端等)

我更喜欢AdviceWith,因为它非常灵活并且利用了熟悉的MockEndpoints。对于这个完整的示例,请参见this unit test

总之,你将创建一个单元测试注入MockEndpoints到您的路线,然后验证对他们像往常一样...

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock all endpoints 
     mockEndpoints(); 
    } 
}); 

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); 

template.sendBody("direct:start", "Hello World"); 
+0

我很欣赏今天的答案 - 是的,我将单独测试组件(及其“过程”方法)。然而,作为组件和它们的输入/输出队列之间的一种“集成测试”的一部分,我确实希望自动化移动定义明确的路由的消息的确定。 AdviceWith API看起来很有趣,我会检查一下。但它的存在似乎无效了对MockEndpoint的需求。你能澄清什么时候适合使用它们吗?并再次感谢! – IAmYourFaja 2011-12-20 20:11:45

+0

亚当,真正的端到端测试,使用AdviceWith动态地将MockEndpoints注入到现有生产路线中。模拟非常强大,因为提供了统计信息/断言API,但不应直接添加到生产路线。我会通过一个例子来更新我的答案...... – 2011-12-21 05:43:03

+0

@boday,你能否告诉我如何向路由发送一个'Exchange'的例子?我问,因为我不清楚你可以如何发送一个'交换'到路由的'from'。提前致谢。 – danidemi 2016-01-11 16:13:55