Spring Boot Data嵌入式Cassandra

9
在我的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服务器?如果有,能否请您展示所需的配置。


3
这里有一个教程,讲解如何使用嵌入式Cassandra进行测试:http://www.baeldung.com/spring-data-cassandra-tutorial。 - Cedric Dumont
4个回答

12

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

在您的src/test/resources/application.properties文件中添加以下内容(请注意,内嵌Cassandra在9142端口启动,而不是默认的9042端口)

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运行您的测试。 希望它有所帮助。


2
这里是你的数据集?我遇到了一个错误: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: 找不到数据集。 - Marco Capo
2
为什么我们需要具有相同artifactId但不同作用域的两个依赖项? - alexSunder

3

Spring Boot没有提供内置的Apache Cassandra支持,也不计划提供。一方面对于内置的Apache Cassandra需求很少,另一方面Apache Cassandra本身带有许多与Boot的其他依赖项冲突的依赖项。

可以查看Cassandra Unit

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


1

OP的解决方案不再适用于最新版本的Spring Boot,因为CassandraUnitDependencyInjectionTestExecutionListener来自cassandra-unit-spring,而该库仅适用于JUnit 4,现在已经使用JUnit 5。

我创建了一个cassandra-unit-spring库,它启动Cassandra服务器并将端口作为Spring Boot环境属性提供。


1

我知道这是一个老话题,但是使用嵌入式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来运行集成测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接