Я пытаюсь написать интеграционный тест Junit для службы Spring Boot, использующей маршруты apache camel xml для обработки данных. (Настоящий) сервис читает из раздела kafka и выполняет некоторые манипуляции с данными, прежде чем подключиться к базе данных и сохранить данные в различных таблицах. Я успешно смоделировал кластер Kafka с помощью Citrus, однако я не могу подключиться к базе данных Citrus и не вижу ошибок в журналах, чтобы выяснить, почему это так.
Обычно реальное приложениераскручивается и делает этот процесс совершенно нормально по отношению к реальной базе данных SQL Server. Соединения определяются через свойства, а драйвер устанавливается как драйвер SQL Server.
Я ознакомился с примерами Citrus для JDBC, настроил конечную точку SingleConnectionDatasource и JDBC и включил в свой файл зависимости Citrus-JDBC и Citrus-JDBC-Driver. Мои application.properties содержат свойства, которые (должны) указывать на экземпляр Citrus JDBC.
Основываясь на некоторой информации журнала, я вижу, что приложение пытается подключиться к БД даже во время тестирования, так как я запустил тест, переключившись на базу данных h2 в памяти и получил ошибки, когда системапытался написать в него. Поэтому я считаю, что моя проблема связана с настройкой Citrus DB и / или моим подключением к ней.
Application Properties:
spring.datasource.url=jdbc:citrus:http://localhost:4567/mockdb
spring.datasource.driver-class-name=com.consol.citrus.db.driver.JdbcDriver
spring.datasource.name=mockdb
JdbcServer bean:
@Bean
public JdbcServer jdbcServer() {
return CitrusEndpoints.jdbc()
.server()
.host("localhost")
.databaseName("mockdb")
.port(4567)
.autoStart(true)
.debugLogging(true)
.build();
}
SingleDataSource bean:
@Bean
public SingleConnectionDataSource dataSource() {
SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
dataSource.setDriverClassName(JdbcDriver.class.getName());
dataSource.setUrl("jdbc:citrus:http://localhost:4567/mockdb");
return dataSource;
}
Apache camel xml route (where the attempt to write to DB is made):
<choice id=“businessObjectThatTriggersThisFlow”>
<when id=“businessObjectThatTriggersThisFlow”>
<xpath>PATH_OF_FILE</xpath>
<split id=“businessObjectFromFile” stopOnException="true">
<xpath>FILE_THAT_GETS_READ_IN</xpath>
<to id="_to5" uri="bean:internalBusinessObjectDataProcessor”/>
<log id=“businessObjectTotalSize” message="Total number of BusinessObjects >>> ${header.CamelSplitSize}"/>
<setBody id="insert_request_business_object_query">
<constant> {{insert.BUSINESS_OBJECT}}</constant>
</setBody>
<!-- <to id="insert_BUSINESS_OBJECT” uri="jdbc:dataSource?useHeadersAsParameters=true"/>-->
<to id=“insert_BUSINESS_OBJECT” uri="jdbc:dataSource"/>
Я также автоматически подключаю JdbcServer и источник соединений в тесте следующим образом:
@Autowired
JdbcServer jdbcServer;
@Autowired
SingleConnectionDataSource dataSource;
Когда приложение вращается, я вижу вЖурналы, что JDBC-сервер запущен:
17:27:24.288 [main] INFO c.c.citrus.jdbc.server.JdbcServer - Started server: jdbcServer
17:27:24.573 [main] INFO o.s.j.d.SingleConnectionDataSource - Loaded JDBC driver: com.consol.citrus.db.driver.JdbcDriver
И тест правильно отправляет сообщение через Kafka и разбивает информацию на соответствующие части. Следующим ожидаемым результатом будет сообщение о регистрации, похожее на следующее, которое происходит во время реального рабочего процесса после вставки объекта:
12:58:19.745 [Camel (camel) thread #0 - KafkaConsumer[kafka.topic.name]] INFO insertLog - Exchange[ExchangePattern: InOnly, Headers: {breadcrumbId=63821-1573061658341-0-4, CamelJdbcUpdateCount=1, kafka.OFFSET=47, kafka.PARTITION=2, kafka.TOPIC=kafka.topic.thattriggersthis, BUSINESS_OBJECT_DATE=, BUSINESS_OBJECT_STATUS=status, BUSINESS_OBJECT_UUID=A059906E-DD6A-4265-A759-01865D385111}, BodyType: null, Body: [Body is null]]
Почему моя служба не подключается к фиктивной БД?