Верблюд isMockEndpointsAndSkip не пропускает конечную точку jdbc

У меня есть маршрут, который заканчивается на конечной точке JDBC:

from(CONNECTOR).routeId(ROUTE_ID).process(createSelectStatement).to(jdbc);

Конечная точка jdbc создается следующим образом:

public static final String DB_NAME = "db";

private void setupJdbcEndpoint() {
    JdbcEndpoint endpoint = getContext().getEndpoint("jdbc:" + DB_NAME, JdbcEndpoint.class);
    endpoint.setOutputClass(OUTClass.class.getName());
    endpoint.setOutputType(JdbcOutputType.SelectList);
    jdbc = endpoint;
}

В моем модульном тесте я хочу "издеваться и пропускать" базу данных:

@Override
public String isMockEndpointsAndSkip() {
    return "jdbc:*";
}

Я также пробовал другие шаблоны: "jdbc:db", "jdbc://db" (эта строка отображается в журнале и является выводом toString)

Но независимо от того, какой шаблон используется, база данных называется. Журнал показывает

org.apache.camel.component.jdbc.JdbcProducer: Executing JDBC Statement: SELECT..

И правильный (пустой) результат отправляется в фиктивную конечную точку в конце. И высмеянная конечная точка mock:jdbc:db или же mock:jdbc://db () никогда ничего не получает.

Так как же пропустить эту конечную точку jdbc?

И как получить ссылку на фиктивные конечные точки, которые создаются с подстановочными знаками, такими как '*'?

РЕДАКТИРОВАТЬ

С этой настройкой я также вижу в журнале:

InterceptSendToMockEndpointStrategy: Adviced endpoint [jdbc://db] with mock endpoint [mock:jdbc:db]

Так isMockEndpointAndSkip похоже на работу?! Но в моем случае конечная точка jdbc не пропускается.

2-е редактирование - попробовал ответ от Вимши Не использую isMockEndpointAndSkip но предоставление AdviceWithRouteBuilder не помогло (я думаю, что верблюд реализует isMockEndpointAndSkip так же). Я вижу в журнале (используя предложенный Вимшей строитель):

InterceptSendToEndpoint[jdbc:* -> [To[mock://jdbc://db]]], process[Processor@0x6e9a5ed8], To[jdbc://db]]]

Кроме того, база данных до сих пор называется фиктивной, конечная точка не видела никакого обмена.

вот строитель в деталях:

new AdviceWithRouteBuilder() {

            @Override
            public void configure() throws Exception {
                replaceFromWith(in);
                interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint().to(dbMock);

            }
        };

2 ответа

Решение

Вимша направился в правильном направлении, но по какой-то причине это не работает interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint()..

Но это работает на моем маршруте, я добавил идентификатор для конечной точки jdbc:

...to(jdbc).id("jdbc")

в тесте я добавил этот AdviceWithRouteBuilder:

new AdviceWithRouteBuilder() {

        @Override
        public void configure() throws Exception {
            replaceFromWith(in);
            // interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint().to(dbMock);
            weaveById("jdbcOut").replace().to(dbMock);
        }
    };

Так weaveById и заменить сделать работу.

Как насчет использования перехватчика для пропуска отправки в конечную точку jdbc и отправки его в фиктивную очередь

RouteDefinition route = context.getRouteDefinitions().get(0);
route.adviceWith(context, new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            interceptSendToEndpoint("jdbc:*")
                .skipSendToOriginalEndpoint()
                .to("mock:jdbc");
        }
});

вы можете изменить свою конечную точку jdbc на эту

private void setupJdbcEndpoint() {
    jdbc = "jdbc:" + DB_NAME + "?outputType=SelectList&outputClass=" + OUTClass.class.getName();
}

Смотрите эту документацию

Другие вопросы по тегам