首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何在骆驼中用蓝图来掩饰终点?

我如何在骆驼中用蓝图来掩饰终点?
EN

Stack Overflow用户
提问于 2016-04-21 08:26:14
回答 2查看 1.1K关注 0票数 1

我正在编写一个应用程序,使用camel在fuse容器中部署(最终)。该项目的性质要求我混合和匹配Java和XML。

我很难让模拟框架与蓝图一起正常工作。

下面是我的单元测试,完全基于示例这里

代码语言:javascript
运行
复制
public class MockNotWorking extends CamelBlueprintTestSupport {

   @Test
   public void testAdvisedMockEndpointsWithPattern() throws Exception {

    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            mockEndpoints("log*");
        }
    });

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

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

    // additional test to ensure correct endpoints in registry
    assertNotNull(context.hasEndpoint("direct:start"));
    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"));

    assertMockEndpointsSatisfied();

   }


  @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"));
        }
    };
  }

  protected String getBlueprintDescriptor() {
    return "OSGI-INF/blueprint/blueprint.xml";
  }
}

我逐字复制了示例这里,并对其进行了非常轻微的修改,因此我们扩展了CamelBlueprintTestSupport而不是CamelTestSupport。这需要超越getBlueprintDescriptor来指向我的蓝图xml,在该蓝图中,我定义了一个非常基本(与测试完全无关)的路由:

代码语言:javascript
运行
复制
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

<camelContext id="validationRoute" xmlns="http://camel.apache.org/schema/blueprint" >

    <route id="validation">
        <from uri="direct:validation" />
        <log message="validating..." />
    </route>
</camelContext>

</blueprint>

测试失败的有:

代码语言:javascript
运行
复制
java.lang.AssertionError: mock://log:foo Received message count. Expected: <1> but was: <0>

因此,这意味着消息没有到达模拟端点。将CamelBlueprintTestSupport更改为CamelTestSupport,它就能工作了。

那么,我如何让这样的模拟与蓝图正确地工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-21 11:07:56

使用蓝图时,它会导入蓝图xml文件中定义的所有路由,并将它们添加到CamelContext中。

这破坏了一切的原因是context.getRouteDefinitions().get(0)不再指唯一的路线--现在不止一条了。因此,当您添加AdviceWithRouteBuilder时,可能会将它添加到错误的路径中。

以下代码修复了问题(并且也适用于非蓝图测试):

代码语言:javascript
运行
复制
List<RouteDefinition> routes = context.getRouteDefinitions();
    for (int i=0;  i<routes.size(); i++)    {
        context.getRouteDefinitions().get(i).adviceWith(context, new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                // mock all endpoints
                mockEndpoints("log*");
            }
        });
    }

======update======

这样做的一个更好的方法是,而不是模仿所有的路线,找到我们的特定路径的id,然后应用通知。这意味着首先设置路径id:

代码语言:javascript
运行
复制
 from("direct:start").routeId("start").to("direct:foo").to("log:foo").to("mock:result");

然后通过id查找路由并像以前一样调用adviceWith

代码语言:javascript
运行
复制
context.getRouteDefinition("start").adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            // mock log endpoints
            mockEndpoints("log*");
        }
    });
票数 0
EN

Stack Overflow用户

发布于 2016-04-22 06:29:43

实际上,这取决于你使用的是哪种版本的骆驼,有些方法并不像预期的那样有效。如果我没记错的话,它在2.12之后有了很大的进步。(2.15更好)

在遇到Camel单元测试之后,我最终记录了这里的所有内容:

http://bushorn.com/unit-testing-apache-camel/

http://bushorn.com/camel-unit-testing-using-mock-endpoint/

顺便说一句,我要做的不是这个"mockEndpoints("log*");“而是这样做:

weaveByToString(".direct:foo.").after().to("mock:log");(我知道这听起来很奇怪;)

或者您是否可以设置端点id。

weaveById("endpoint-id-of-direct-foo").after().to("mock:log");

weaveAddLast().to("mock:log");

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36763892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档