使用MockEndpoints测试Camel

IAm*_*aja 17 java messaging unit-testing apache-camel

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

基本组件模式

每个组件消耗输入队列中的消息,处理消息,然后在出站/输出队列上放置1+消息.然后,"输出"队列成为链中下一个组件的"输入"队列.很基本的.

我现在正试图卷起袖子,并使用MockEndpointsCamel的测试API提供的每个组件的单元测试.我一直在倾倒javadocs和Camel网站上的一些例子,但我很难连接所有的点.

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

  • 测试是否有消息等待特定的"输入"队列
  • 拉下这些消息并处理它们
  • 将新消息推送到"输出"队列并验证它们是否在那里

相信我需要MockEndpoints为每个队列创建如下:

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

@EndpointInject(uri = "mock:outputQueue")
protected MockEndpoint outputQueue;
Run Code Online (Sandbox Code Playgroud)

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

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

    outputQueue.assertIsSatisfied();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*Day 12

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

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

如果要对路由进行端到端测试,请考虑使用这些方法之一来验证路由中的每个步骤是否都满足.

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

我更喜欢AdviceWith,因为它非常灵活,可以利用熟悉的MockEndpoints.有关此的完整示例,请参阅此单元测试

简而言之,您将创建一个单元测试,将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");
Run Code Online (Sandbox Code Playgroud)