使用 MockEndpoint 测试 Camel

2022-09-02 13:55:49

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

Basic component pattern

其中,每个组件使用输入队列中的消息,处理消息,然后将 1 条以上消息放在出站/输出队列中。然后,“输出”队列成为链中下一个组件的“输入”队列。很基本。

我现在正试图卷起袖子,使用Camel的测试API为每个组件提供单元测试。我一直在翻阅Javadocs和Camel网站上的几个例子,但是很难连接所有点。MockEndpoints

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

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

我相信我需要为每个队列创建,如下所示: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();
}

我只是不明白如何正确地连接一切:

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

答案 1

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

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

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

  • 使用 NotifyBuilder 构建 Exchange 验证表达式(有点复杂,无法理解)
  • 使用 AdviceWith 在路由运行之前动态更改路由(添加日志/模拟终结点等)

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

答案 2

推荐