Встроенные данные Spring Boot Cassandra

В моем приложении Spring Boot 1.5.1 я собираюсь написать модульные/интеграционные тесты для логики, связанной с Cassandra.

Я добавил следующую зависимость Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

Конфигурация Spring Boot Cassandra по умолчанию будет подключаться к реальному серверу Cassandra DB.

Есть ли какие-либо параметры в Spring/Spring Boot для настройки моих тестов на использование встроенного сервера Cassandra? Если да, то не могли бы вы показать необходимую конфигурацию.


person alexanoid    schedule 13.02.2017    source источник
comment
здесь учебник, объясняющий, как тестировать встроенную cassandra: baeldung.com/spring-data- Кассандра-учебник   -  person Cedric Dumont    schedule 17.03.2018


Ответы (4)


Используем на проекте Cassandra + Spring Boot. Вот шаги, которые сработали для нас:

а) Настройте свой тест следующим образом

import org.cassandraunit.spring.CassandraDataSet;
import org.cassandraunit.spring.CassandraUnitDependencyInjectionTestExecutionListener;
import org.cassandraunit.spring.CassandraUnitTestExecutionListener;
import org.cassandraunit.spring.EmbeddedCassandra;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfiguration.class)
@TestExecutionListeners(listeners = {
    CassandraUnitDependencyInjectionTestExecutionListener.class,
    CassandraUnitTestExecutionListener.class,
    ServletTestExecutionListener.class,
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class
})
@EmbeddedCassandra(timeout = 60000)
@CassandraDataSet(value = {"bootstrap_test.cql"}, keyspace = "local_test")
public abstract class BaseTest {

б) в вашем src/test/resources/application.properties добавьте это (обратите внимание, встроенная cassandra запускается на порту 9142, а не на 9042 по умолчанию)

spring.data.cassandra.port=9142
spring.data.cassandra.keyspace-name=local_test

c) Создайте пустой файл bootstrap_test.cql в src/test/resources

г) Добавьте в свой pom.xml

    <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit-spring</artifactId>
        <version>${cassandra-unit.version}</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.cassandraunit</groupId>
                <artifactId>cassandra-unit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit-spring</artifactId>
        <version>${cassandra-unit.version}</version>
    </dependency>

Этого должно быть достаточно для запуска ваших тестов с Embedded Cassandra. Надеюсь, поможет.

person walv    schedule 11.04.2018
comment
Какой у вас здесь набор данных? Я получаю сообщение об ошибке: 12:28:49.883 [main] ОШИБКА org.springframework.test.context.TestContextManager - Обнаружено исключение при разрешении TestExecutionListener [org.cassandraunit.spring.CassandraUnitDependencyInjectionTestExecutionListener@1ebea008] для подготовки тестового экземпляра [net.gueka .user.service.UserServiceTest@38e7ed69] org.cassandraunit.dataset.ParseException: набор данных не найден - person Marco Capo; 20.04.2019
comment
Зачем нам нужны две зависимости с одинаковым идентификатором артефакта и разными областями? - person alexSunder; 15.08.2020

В Spring Boot нет встроенной поддержки Apache Cassandra, и это не планируется. С одной стороны, спрос на встроенный Apache Cassandra невелик, с другой стороны, Apache Cassandra поставляется с множеством зависимостей, которые конфликтуют с другими зависимостями Boot.

Взгляните на Cassandra Unit.

Вы также можете создать собственное тестовое правило при использовании тестов JUnit, которое дает вам полный контроль над версией Apache Cassandra, поведением во время выполнения и так далее. Взгляните на возможную реализацию: CassandraRule.java.

person mp911de    schedule 13.02.2017

Я знаю, что это старая тема, НО есть два подхода к использованию встроенной Cassandra с Spring.

1. Первый подход с Cassandra Unit Spring

Я создал пример приложения, и вы можете проверить следующий репозиторий Github.

Примечание: встроенный сервер запускается с порта 9142, а НЕ с порта 9042 !!!

2. Второй подход — использовать maven-plugin.

Шаг 1:

Добавьте следующие подключаемые модули maven в pom.xml.

            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cassandra-maven-plugin</artifactId>
                <version>3.6</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>start</goal>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <startNativeTransport>true</startNativeTransport>
                </configuration>
            </plugin>

Шаг 2:

Создайте каталог cassandra/cql на корневом уровне вашего проекта. Из этого каталога встроенный сервер Cassandra инициализирует вашу базу данных.

Важно! Все файлы из этого каталога являются файлами .cql.

Пример: cassandra/cql/load.cql

Шаг 3.

Создание интеграционных тестов.

Важно! Только тестовые классы с суффиксом IT интерпретируются подключаемым модулем surfire как интеграционные тесты.

Шаг 4:

mvn verify для запуска интеграционных тестов.

person Rzv Razvan    schedule 12.09.2019

Решение OP больше не применимо к последним версиям Spring Boot, поскольку CassandraUnitDependencyInjectionTestExecutionListener исходит из cassandra-unit-spring, который работает только с JUnit 4, и мир перешел на JUnit 5.

Я создал библиотеку cassandra-unit-spring, которая запускает сервер Cassandra и делает порты, доступные как свойства среды Spring Boot.

person Abhijit Sarkar    schedule 28.09.2020