骆驼-有问题的建议

时间:2018-10-27 05:32:57

标签: junit apache-camel

我想创建一个JUNIT测试,对于执行数据库搜索的路由,它指向我的模拟数据库搜索。

两个搜索都定义为端点:

<endpoint id="select-info" uri="sql:{select ...}"/>
<endpoint id="mock-select-info" uri="sql:{select ...}"/>

当前,我唯一可以实现的方法是更改​​使用模拟端点的路由,但这绝对不是理想的。我已经在代码中看到了其他使用adviceWith的JUNIT测试(因此,这不是骆驼发布的问题,正如我在其他文章中看到的那样),但是我可能理解不对,因为我没有成功使用它。 / p>

所以,假设路线如下:

<route id="request-route" ...>

            <from uri="direct:request-handler" /> 

            <to ref="select-info" />
</route>   

我使用以下代码创建了Junit:

@Test
    public void testEntireRouteWithMockSelect() throws Exception {

        context.getRouteDefinition(ORCHESTRATION_ROUTE_ID).adviceWith(context,
                new AdviceWithRouteBuilder() {
                    @Override
                    public void configure() throws Exception {
                        weaveById("select-info").replace().to("mock-select-info");


                    }
                });

        context.setTracing(true);
        context.start();   

        //response validation and asserts       

    }

我在上面的代码中的理解是,在路由执行过程中,将使用“ mock-select-info”代替“ select-info”,但是执行失败并显示以下错误消息:

***java.lang.IllegalArgumentException: There are no outputs which matches: select-info in the route*** 

根据收到的说明,我知道这与使用ref而不是id有关。

但是我不知道如何更改路线。我想尝试一下(根据评论,这就是我的理解,我可以做到):

<to ref="select-info" id="select-info"/>

但是随后它将抛出NullPointerException。

我正在使用骆驼2.15 BTW。

谢谢!

1 个答案:

答案 0 :(得分:0)

引用组件会创建该组件的新副本。声明端点时,您声明的模板不是实际的端点组件。记住要成为实际端点,它必须位于<from><to>标记中。

例如:

<endpoint id="select-info" uri="sql:{select ...}"/> <!-- The endpoint ID is used to reference the component-->

此组件的ID为select-info,如果要使用此端点,请在参考中使用此ID。

例如:

<from ref="select-info"> <!--This component does not have an ID. It does not inherit the ID from the endpoint it references -->

当您这样声明时:

 <to ref="select-info" id="select-info"/> 

这是不正确的,因为端点模板的ID有一个重复的ID,并且您告诉骆驼<to>端点(模板的副本)具有相同的ID。 ID必须是唯一的。

将代码更改为此

<to id="to-select-info" ref="select-info"/>

请注意,现在将要运行的组件副本的ID为to-select-info。这是将实际在路线中运行的组件。当您编织并使用select-info作为值时,它将不会找到组件,但会找到组件模板。这就是为什么它是NULL指针的原因,没有名为select-info的组件,只有名为select-info的模板

将测试代码更改为:

public void configure() throws Exception {
                    weaveById("to-select-info").replace().to("mock-select-info");

在上面的示例中,我选择的端点to-select-info可以替换,因为它是实际组件而不是模板。