使用MockEndpoints测试Camel

时间:2011-12-20 17:21:29

标签: java unit-testing messaging apache-camel

我有一系列“流水线”组件,它们都通过ActiveMQ消息队列进行通信。每个组件都使用Camel将每个队列视为端点。每个组件使用相同的基本模式:

Basic component pattern

每个组件消耗输入队列中的消息,处理消息,然后在出站/输出队列上放置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();
}

我只是不明白如何正确连接所有内容:

  • 如何将compinputQueueoutputQueue MockEndpoints联系起来?
  • 对于每个MockEndpoint,如何设置期望值以便assertIsSatisfied()检查特定队列中是否存在消息,或者特定队列是否包含消息?

1 个答案:

答案 0 :(得分:12)

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

对于POJO组件,blackbox会将它们与任何Camel上下文/路由分开测试,以专注于业务逻辑。

如果您想对路线进行端到端测试,请考虑使用其中一种方法来验证路线中的每一步都得到满足。

  • 使用NotifyBuilder构建Exchange验证表达式(稍微复杂一点)
  • 使用AdviceWith在运行之前动态更改路由(添加Log / Mock端点等)

我更喜欢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");