SpringBoot:使用Cassandra进行单元测试

时间:2016-08-02 12:42:47

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

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

/*
 * 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

3 个答案:

答案 0 :(得分:3)

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

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

  1. 请使用@SpringBootTest代替@EnableAutoConfiguration。这样可以在步骤2中启用配置属性支持等其他一些功能。

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

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

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

    或者,您可以使用

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

答案 1 :(得分:1)

我认为cassandra-unit-spring版本3.x对我来说是不兼容的。更好的2.x。

使用2.x时会出现错误日志

15:10:23.366 [pool-1-thread-1] ERROR org.apache.cassandra.service.CassandraDaemon - cassandra.jmx.local.port missing from cassandra-env.sh, unable to start local JMX service.null

答案 2 :(得分:0)

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest({ "spring.data.cassandra.port=9142",
        "spring.data.cassandra.keyspace-name=keyspaceToCreate" })
@EnableAutoConfiguration
@ComponentScan
@ContextConfiguration
@TestExecutionListeners({ CassandraUnitDependencyInjectionTestExecutionListener.class,
        DependencyInjectionTestExecutionListener.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>2.1.9.2</version>
        <scope>test</scope>
    </dependency>

作品。

但如果升级到

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

我再次收到错误

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))