Верблюд - Совет с вопросом - PullRequest
0 голосов
/ 27 октября 2018

Я хочу создать тест JUNIT, который для маршрута, который выполняет поиск в базе данных, указывает на мой фиктивный поиск в базе данных.

Оба поиска определены как конечные точки:

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

В настоящее время единственный способ, которым я могу добиться, это изменить маршрут, чтобы использовать фиктивную конечную точку, но это определенно не идеально.Я видел в коде другие JUNIT-тесты, использующие adviceWith (так что это не проблема выпуска верблюда, как я видел в других постах), но, возможно, я неправильно понимаю, так как мне не удается его использовать.

Итак, предположим, что маршрут выглядит следующим образом:

<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       

    }

Насколько я понимаю в приведенном выше коде, во времяВыполнение маршрута, вместо использования «select-info», будет использоваться «mock-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.

Я использую Camel 2.15 BTW.

Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2018

При ссылке на компонент создается новая копия компонента. Когда вы объявляете конечную точку, вы объявляете шаблон не действительным компонентом конечной точки. Помните, чтобы быть фактической конечной точкой, она должна быть в теге <from> или <to>.

Например:

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

Идентификатор этого компонента select-info, вы используете его в ссылке, когда хотите использовать эту конечную точку.

Например:

<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 для шаблона конечной точки, и вы говорите верблюду, что конечная точка <to> (копия шаблона) имеет тот же идентификатор. Идентификаторы должны быть уникальными.

Измените код на этот

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

Обратите внимание, что копия компонента, которая будет работать, теперь имеет идентификатор to-select-info. Это компонент, который фактически будет работать на маршруте. Когда вы weaveById и используете select-info в качестве значения, он не найдет компонент, но найдет шаблон компонента. Вот почему это указатель NULL, нет компонента с именем select-info, только шаблон с именем select-info

Измените свой тестовый код на:

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

В приведенном выше примере я выбираю конечную точку to-select-info, которая может быть заменена, поскольку она является компонентом фактически, а не шаблоном.

...