【问题标题】:Spring Boot Data Embedded CassandraSpring Boot 数据嵌入式 Cassandra
【发布时间】:2017-07-01 23:08:19
【问题描述】:

在我的 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 服务器?如果是这样,请您显示所需的配置。

【问题讨论】:

标签: spring spring-boot cassandra spring-data-cassandra


【解决方案1】:

我们在项目中使用 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>

这应该足以使用 Embedded Cassandra 运行您的测试。 希望对您有所帮助。

【讨论】:

  • 你这里的数据集是什么?我收到一个错误:12:28:49.883 [main] ERROR org.springframework.test.context.TestContextManager - 在允许 TestExecutionListener [org.cassandraunit.spring.CassandraUnitDependencyInjectionTestExecutionListener@1ebea008] 准备测试实例时捕获异常 [net.gueka .user.service.UserServiceTest@38e7ed69] org.cassandraunit.dataset.ParseException: 找不到数据集
  • 为什么我们需要两个具有相同 artifactId 和不同范围的依赖项?
【解决方案2】:

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

看看Cassandra Unit

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

【讨论】:

    【解决方案3】:

    我知道这是一个老话题但是有两种方法可以将嵌入式 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 插件解释为集成测试。

    第 4 步:

    mvn verify 运行集成测试

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-06-13
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 2019-04-05
        • 2015-11-16
        • 2015-10-07
        • 2018-05-28
        • 2013-11-23
        相关资源
        最近更新 更多