如何验证embedded-cassandra脚本执行结果及排查启动问题
一、修复Embedded Cassandra未正确启动的问题
你提到没把cassandraFactory传入TestCassandra,这确实是核心问题——直接new TestCassandra()并不会使用你配置好的Cassandra工厂实例,导致Cassandra根本没按你设定的版本和规则启动。
正确的做法是通过cassandraFactory来构建TestCassandra实例,而不是直接调用无参构造。根据embedded-cassandra的标准API,你可以这样调整:
val cassandraFactory = factory.create() val testCassandra = TestCassandra.builder() .cassandra(cassandraFactory) .build()
这样就能确保使用你指定了版本(3.11.1)的Cassandra实例,彻底解决启动异常的问题。
二、消除认证警告
这条警告的根源是:你的Datastax驱动配置了PlainTextAuthProvider,但Embedded Cassandra默认没有启用认证机制,驱动发起连接时没收到预期的认证挑战,所以抛出了警告。
有两种简单的解决方式:
- 方式1:禁用驱动的认证配置
在创建Cassandra连接时,显式去掉认证提供者的配置:val cluster = Cluster.builder() .addContactPoints("127.0.0.1") .withPort(9042) .withoutAuthProvider() // 明确禁用认证 .build() - 方式2:给Embedded Cassandra开启认证
如果你的测试需要模拟生产环境的认证场景,可以通过配置启用Cassandra的密码认证:
同时驱动侧配置默认的用户名密码(默认是factory.setConfigProperties(Map( "authenticator" -> "PasswordAuthenticator", "authorizer" -> "CassandraAuthorizer" ))cassandra/cassandra)即可。
三、获取并打印脚本执行结果
executeScripts方法通常不会主动返回执行结果,你可以通过获取Cassandra的Session手动执行语句,然后处理ResultSet来确认执行状态:
修改测试代码,在启动TestCassandra后主动获取Session执行语句并打印:
try { testCassandra.start() // 获取Cassandra会话 val session = testCassandra.getSession() // 执行创建Keyspace的语句并提示结果 session.execute(statement1) println("✅ Keyspace 'myspace' 创建成功") // 执行查询语句并打印所有结果 val resultSet = session.execute(statement2) println("\n📋 查询到的Keyspace列表:") resultSet.forEach { row => println(s"- ${row.getString("keyspace_name")}") } } finally { testCassandra.stop() }
这样你就能在控制台清晰看到脚本是否执行成功,以及查询到的具体数据。
四、解决TestCassandra参数过多的错误
你直接传入cassandraFactory和cqlStatements时触发参数过多错误,是因为TestCassandra的构造函数不支持这种传参方式。正确的做法是用Builder模式逐步配置:
val testCassandra = TestCassandra.builder() .cassandra(cassandraFactory) .scripts(cqlStatements) // 如果API支持直接传入脚本集合的话 .build()
如果scripts方法不存在,也可以像第三部分那样,启动后手动通过Session执行脚本,效果是一样的。
内容的提问来源于stack exchange,提问作者Manu Chadha

