使用MockEndpoints测试骆驼
我有一系列“流水线”组件,都通过ActiveMQ消息队列进行通信。每个组件使用Camel将这些队列中的每一个作为端点处理。每个组件使用相同的基本模式:使用MockEndpoints测试骆驼
其中每个组件使用消息关的输入队列的,处理该消息(一个或多个),然后放置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();
}
我只是不理解如何连接一切正常:
- 如何连接
comp
到inputQueue
和outputQueue
个MockEndpoints? - 对于每个
MockEndpoint
,我如何设置期望以便assertIsSatisfied()
检查消息是否存在于特定队列中,或者特定队列是否包含消息?
亚当,有几种方法可以做到这一点。
对于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");
我很欣赏今天的答案 - 是的,我将单独测试组件(及其“过程”方法)。然而,作为组件和它们的输入/输出队列之间的一种“集成测试”的一部分,我确实希望自动化移动定义明确的路由的消息的确定。 AdviceWith API看起来很有趣,我会检查一下。但它的存在似乎无效了对MockEndpoint的需求。你能澄清什么时候适合使用它们吗?并再次感谢! – IAmYourFaja 2011-12-20 20:11:45
亚当,真正的端到端测试,使用AdviceWith动态地将MockEndpoints注入到现有生产路线中。模拟非常强大,因为提供了统计信息/断言API,但不应直接添加到生产路线。我会通过一个例子来更新我的答案...... – 2011-12-21 05:43:03
@boday,你能否告诉我如何向路由发送一个'Exchange'的例子?我问,因为我不清楚你可以如何发送一个'交换'到路由的'from'。提前致谢。 – danidemi 2016-01-11 16:13:55
的http://计算器。 com/questions/5664331/how-to-unit-test-production-routes-in-apache-camel – 2011-12-20 19:53:45