【问题标题】:SpringBoot: Unit Test with CassandraSpring Boot:使用 Cassandra 进行单元测试
【发布时间】:2016-12-07 19:49:27
【问题描述】:

我想测试我的 SpringBoot 应用程序,它使用 cassandra 作为 CrudRepository。我最终得到了

/*
 * https://github.com/jsevellec/cassandra-unit/wiki/Spring-for-Cassandra-unit
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan
@ContextConfiguration(value = { "classpath:/default-context.xml" })
@TestExecutionListeners({ CassandraUnitTestExecutionListener.class })
@CassandraDataSet(value = { "setupTables.cql" }, keyspace = "keyspaceToCreate")
@CassandraUnit
public class ApplicationTests {

    @Autowired
    MyCassandraRepository repo;

    @Test
    public void contextLoads() {

        System.out.println(repo.findAll());

    }

}

    <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit-spring</artifactId>
        <version>3.0.0.1</version>
        <scope>test</scope>
    </dependency>

CREATE TABLE MY_CASSANDRA_ENTRY (
  MY_CASS_STRING varchar PRIMARY KEY
)

这导致

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9142 (com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table schema_keyspaces))

如果我使用旧版本的 cassandra-unit-spring

    <dependency>
        <groupId>org.cassandraunit</groupId>
        <artifactId>cassandra-unit-spring</artifactId>
        <version>2.1.9.2</version>
        <scope>test</scope>
    </dependency>

它以 NullPointerException 结束,因为未注入值 repo。

来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit.test

【问题讨论】:

  • 你用的是女巫版的spring boot和spring data cassandra吗?在某些版本中,某些网络依赖项存在冲突。如果您使用 gradle 或 maven,查看依赖树可能会有所帮助

标签: java unit-testing spring-boot cassandra spring-data-cassandra


【解决方案1】:

CassandraUnit 在端口 9142 上启动。 Spring Boot 默认使用端口9042。您需要设置端口和键空间名称,以便 Cassandra 驱动程序可以获取正确的连接详细信息。

您需要在测试中更改两件事:

  1. 请使用@SpringBootTest 而不是@EnableAutoConfiguration。这会启用其他一些功能,例如您在第 2 步中需要的配置属性支持。

  2. 创建src/test/resources/application.properties 并设置端口和键空间名称。

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

这将配置正确的端口和密钥空间。

或者,您可以使用

指定属性
@SpringBootTest({"spring.data.cassandra.port=9142",
                 "spring.data.cassandra.keyspace-name=keyspaceToCreate"})

【讨论】: