我有一系列“流水线”组件,它们都通过ActiveMQ消息队列进行通信。每个组件都使用Camel将每个队列视为端点。每个组件使用相同的基本模式:
每个组件消耗输入队列中的消息,处理消息,然后在出站/输出队列上放置1+消息。然后,“输出”队列成为链中下一个组件的“输入”队列。非常基本。
我现在正试图卷起袖子,使用Camel的测试API提供的MockEndpoints
为每个组件提供单元测试。我一直在倾倒javadocs以及Camel网站上的一些例子,但我很难连接所有的点。
在我看来,对于每个组件,我的单元测试的一部分将要完成以下三件事:
我相信我需要为每个队列创建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()
检查特定队列中是否存在消息,或者特定队列是否包含消息?答案 0 :(得分:12)
对于POJO组件,blackbox会将它们与任何Camel上下文/路由分开测试,以专注于业务逻辑。
如果您想对路线进行端到端测试,请考虑使用其中一种方法来验证路线中的每一步都得到满足。
我更喜欢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");