Верблюд 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();
}
Смотрите эту документацию