我想创建一个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。
谢谢!
答案 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
可以替换,因为它是实际组件而不是模板。