Spring 引导数据嵌入式 Cassandra

Spring Boot Data Embedded Cassandra

在我的 Spring Boot 1.5.1 应用程序中,我将为 Cassandra 相关逻辑编写 unit/integration 测试。

我添加了以下 Maven 依赖项:

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

默认 Spring Boot Cassandra 配置将连接到真实的 Cassandra 数据库服务器。

Spring/Spring Boot 中是否有任何选项可以将我的测试配置为使用嵌入式 Cassandra 服务器?如果是这样,能否请您显示所需的配置。

Spring 引导中没有嵌入式 Apache Cassandra 支持,并且未计划。一方面对嵌入式 Apache Cassandra 的需求不大,另一方面,Apache Cassandra 自带很多依赖,与 Boot 的其他依赖冲突。

看看Cassandra Unit

您还可以在使用 JUnit 测试时构建自己的测试规则,这样您就可以完全控制 Apache Cassandra 版本、运行时行为等。看一下可能的实现:CassandraRule.java.

我们在项目上使用Cassandra + Spring Boot。 以下是对我们有用的步骤:

a) 像这样配置你的测试

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 {

b) 在你的 src/test/resources/application.properties 中,添加这个(请注意,嵌入式 cassandra 在端口 9142 上启动,但不是在默认端口 9042 上)

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

c) 在 src/test/resources

中创建空文件 bootstrap_test.cql

d) 添加到您的 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>

这应该足以 运行 您使用嵌入式 Cassandra 进行的测试。 希望对你有帮助。

我知道这是一个老话题 但是 有两种方法可以将嵌入式 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 目录。 Embedded Cassandra 服务器将从该目录初始化您的数据库。

重要提示: 此目录中的所有文件都是 .cql 文件。

示例:cassandra/cql/load.cql

第 3 步:

创建集成测试。

重要:只有IT后缀的测试类被surfire[=64解释=] 插件作为集成测试。

第 4 步:

mvn 验证 到 运行 集成测试

OP 的解决方案不再适用于最新版本的 Spring Boot,因为 CassandraUnitDependencyInjectionTestExecutionListener 来自仅适用于 JUnit 4 的 cassandra-unit-spring,并且世界已经转移到JUnit 5.

我创建了一个 cassandra-unit-spring 库来启动 Cassandra 服务器并使端口可用作 Spring 引导环境属性。