4

我想測試使用cassandra作爲CrudRepository的SpringBoot應用程序。我結束了SpringBoot:使用Cassandra進行單元測試

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

如果我使用的是舊版本卡桑德拉單元彈簧

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

它以NullPointerException結束,因爲值回購沒有被注入。

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

回答

1

我想卡桑德拉單位彈簧的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 
3

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