Как всем известно, для запуска интеграционных тестов maven имеет три фазы:
- pre-integration-test
- integration-test
- post-integration-test
Фаза pre-integration-test специально создана для того, чтобы подготовить среду к запуску интеграционных тестов. В этой фазе можно (и нужно) запускать внешние сервисы, создавать структуры баз данных, деплоить собранный war и т. д.
На фазе integration-test осуществляется непосредственный запуск интеграционных тестов (по умолчанию интеграционными считаются тесты, названия классов которых заканчиваются на IT).
Фаза post-integration-test позволяет освободить ресурсы и остановить запущенные на фазе pre-integration-test сервисы.
Плагин Mojo’s Cassandra Maven Plugin позволяет нам запускать Cassandra для использования интеграционными тестами.
В самом простейшем случае он подключается в “pom.xml” в разделе plugins следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cassandra-maven-plugin</artifactId> <version>3.6</version> <configuration> <cqlEncoding>UTF-8</cqlEncoding> <script>src/test/resources/cql/tracking-cassandra-init.cql</script> <startNativeTransport>true</startNativeTransport> <nativeTransportPort>9042</nativeTransportPort> </configuration> <executions> <execution> <goals> <goal>start</goal> <goal>stop</goal> </goals> </execution> </executions> </plugin> ... </plugins> |
Использованные параметры конфигурации:
cqlEncoding задаёт кодировку файла, указанного в script.
script указывает на путь к файлу с CQL-командами, инициализирующими базу Cassandra.
startNativeTransport по умолчанию false, мы выставляем true, чтобы использовать datastax клиент.
nativeTransportPort — порт.
На момент написания этой статьи CQL-команды в файле инициализации базы разделяются обычным string.split(";"), что не позволяет заполнять таблицы Cassandra строковыми литералами, содержащими символ «;» (semicolon или точка с запятой). Посмотрите сами, если не верите.
Я попытался это хоть как-то улучшить, для этого я предположил, что нормальная команда должна завершаться не просто символом «;», а этот символ должен находиться в конце строки, тогда мы хотя бы получим возможность передачи этого символа в строковых литералах.
Зацените мой pull request с предложенным исправлением:
1 |
this.statements = statements.split("(?m);\\s*$"); |
Я также подготовил небольшой тест для проверки возможности отправки символа «;» внутри строк.
Файл «tracking-cassandra-init.cql» подготовленного теста, пытающийся вставить строку, содержащую символ «;» в базу:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE KEYSPACE keyspace1 WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; use keyspace1; CREATE TABLE configuration ( name ascii, value text, PRIMARY KEY ( name ) ) WITH compression = { 'sstable_compression' : 'LZ4Compressor' }; -- Problem in String.split(";") here -- https://github.com/mojohaus/cassandra-maven-plugin/blob/408653092ba659013984b7153e77b0545ac7e903/src/main/java/org/codehaus/mojo/cassandra/AbstractCqlExecMojo.java#L98 -- It cannot determine right line end. INSERT INTO configuration (name,value) VALUES('config.name2', 'qqqqqq;wwwwwww'); |
Тест, пытающийся считать вставленную строку с символом «;»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package ru.urvanov.javaexamples.cassandramavenplugintest; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Session; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; public class MyTestIT { @Test public void test1() { //queries String query = "SELECT * FROM configuration"; //Creating Cluster object Cluster cluster = Cluster.builder() .addContactPoint("127.0.0.1").build(); //Creating Session object Session session = cluster.connect("keyspace1"); //Getting the ResultSet ResultSet result = session.execute(query); List<String> values = new ArrayList<>(); result.forEach(item -> values.add(item.getString("value"))); assertEquals("qqqqqq;wwwwwww", values.get(0)); } } |
Готовый проект выложен на GitHub. Можете склонировать репозиторий:
1 |
git clone https://github.com/urvanov-ru/cassandra-maven-plugin-semicolon-test.git |
Тесты запускаются из корня проекта командой:
1 |
mvn clean verify |
Вы также можете запускать отдельные тесты из вашей IDE, но вам сначала нужно запустить Cassandra в фоновом режиме с фазы pre-integration-test:
1 |
mvn cassandra:run |
После чего запускайте тесты как обычно.