227.7. 模拟现有端点


从 Camel 2.7 开始提供

Camel 现在允许您自动模拟 Camel 路由中的现有端点。

注意

它如何让 端点仍在操作中。发生了什么情况是,Mock 端点被注入并首先接收消息,然后将消息委派给目标端点。您可以将它视为拦截器类型,以及委派或端点监听程序。

假设您有以下给定路由:

Route

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("direct:start").to("direct:foo").to("log:foo").to("mock:result");

            from("direct:foo").transform(constant("Bye World"));
        }
    };
}
Copy to Clipboard Toggle word wrap

然后,您可以使用 Camel 中的 recommendations With 功能模拟单元测试中给定路由中的所有端点,如下所示:

recommendationsWith 模拟所有端点

public void testAdvisedMockEndpoints() throws Exception {
       // advice the first route using the inlined AdviceWith route builder
       // which has extended capabilities than the regular route builder
       context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
           @Override
           public void configure() throws Exception {
               // mock all endpoints
               mockEndpoints();
           }
       });

       getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World");
       getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World");
       getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");
       getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");

       template.sendBody("direct:start", "Hello World");

       assertMockEndpointsSatisfied();

       // additional test to ensure correct endpoints in registry
       assertNotNull(context.hasEndpoint("direct:start"));
       assertNotNull(context.hasEndpoint("direct:foo"));
       assertNotNull(context.hasEndpoint("log:foo"));
       assertNotNull(context.hasEndpoint("mock:result"));
       // all the endpoints was mocked
       assertNotNull(context.hasEndpoint("mock:direct:start"));
       assertNotNull(context.hasEndpoint("mock:direct:foo"));
       assertNotNull(context.hasEndpoint("mock:log:foo"));
   }
Copy to Clipboard Toggle word wrap

请注意,模拟端点被授予 URI mock:<endpoint&gt;,如 mock:direct:fooINFO 级别的 Camel 日志级别是模拟的端点:

INFO  Adviced endpoint [direct://foo] with mock endpoint [mock:direct:foo]
Copy to Clipboard Toggle word wrap
注意

模拟的端点没有参数
端点,被模拟将具有被模拟的参数被剥离。例如,端点 log:foo?showAll=true 将被模拟到以下端点 mock:log:foo。注意参数已被删除。

也可以仅使用模式模拟某些端点。例如,要模拟您执行 的所有日志 端点,如下所示:

recommendationsWith mocking only log endpoint using a pattern

public void testAdvisedMockEndpointsWithPattern() throws Exception {
    // advice the first route using the inlined AdviceWith route builder
    // which has extended capabilities than the regular route builder
    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            // mock only log endpoints
            mockEndpoints("log*");
        }
    });

    // now we can refer to log:foo as a mock and set our expectations
    getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World");

    getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");

    template.sendBody("direct:start", "Hello World");

    assertMockEndpointsSatisfied();

    // additional test to ensure correct endpoints in registry
    assertNotNull(context.hasEndpoint("direct:start"));
    assertNotNull(context.hasEndpoint("direct:foo"));
    assertNotNull(context.hasEndpoint("log:foo"));
    assertNotNull(context.hasEndpoint("mock:result"));
    // only the log:foo endpoint was mocked
    assertNotNull(context.hasEndpoint("mock:log:foo"));
    assertNull(context.hasEndpoint("mock:direct:start"));
    assertNull(context.hasEndpoint("mock:direct:foo"));
}
Copy to Clipboard Toggle word wrap

支持的模式可以是通配符或正则表达式。请参阅与 Camel 使用的相同匹配功能进行通信的更多详细信息。

注意

请注意,模拟端点会在到达模拟时复制消息。
这意味着 Camel 将使用更多内存。当您发送大量消息时,这可能不适用。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat