Java 无法测试Cassandra ExecuteASync响应

Java 无法测试Cassandra ExecuteASync响应,java,junit,cassandra,Java,Junit,Cassandra,这是我的原始方法示例 public void insertIntoDb(SampleObject sample){ --------------------------------------- --------------------------------------- code to prepare Insert statement --------------------------------------- ---------

这是我的原始方法示例

public void insertIntoDb(SampleObject sample){
      ---------------------------------------
      ---------------------------------------
      code to prepare Insert statement
      ---------------------------------------
      ---------------------------------------
      session.executeAsync(insertStatement);
}
我正在为上述方法编写一个测试方法

public void insertIntoDbTest(){
      --------------------------------------
      ---------------------------------------
      preparing SampleObject and checking the size of the corresponding table before insert
      ---------------------------------------
      ---------------------------------------
      obj.insertIntoDb(sampleObject)

      ---------------------------------------
      checking the size of the corresponding table after insert
      ---------------------------------------
}
期望值:在执行上述测试方法后,应向cassandra中的表中添加1个额外的行,即如果插入表大小之前为0,则插入表大小之后为1

实际:我得到了相同的大小,即前后表的大小仅为0

如果我替换

session.executeAsync(insertStatement)

ResultSetFuture=session.executeAsync(insertStatement)

然后添加下面的语句

future.get()

然后,我得到了表大小的差异,即1

当您第一次尝试验证表大小时,我怀疑计算(插入)未完成

ResultSetFuture get()
方法在必要时等待计算完成,然后检索其结果

executeAsync
方法不等待

一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常。来源:

当您第一次尝试验证表大小时,我怀疑计算(插入)未完成

ResultSetFuture get()
方法在必要时等待计算完成,然后检索其结果

executeAsync
方法不等待


一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常。源代码:

future.get()是一个阻止代码,因此它确保异步线程执行并返回响应。在您的情况下,它将确保插入一条记录,这就是为什么在调用future.get()后断言时大小为1的原因,如果不调用get(),那么它将是异步的,您可能需要调用future.complete()在这种情况下,将有两种情况,一种是有异常,另一种是没有异常,此方法的返回类型将是Future对象,您必须在方法调用跟踪上方的某个位置处理它。

Future.get()是一个阻塞代码,因此它确保异步线程执行并返回响应。在您的情况下,它将确保插入一条记录,这就是为什么在调用future.get()后断言时大小为1的原因,如果不调用get(),那么它将是异步的,您可能需要调用future.complete()在这种情况下,将有两种情况,一种是例外情况,另一种是不例外情况,此方法的返回类型将是未来对象,您必须在方法调用跟踪上方的某个位置处理。

我无法更改原始方法功能我无法更改原始方法功能我无法更改原始方法功能您可以尝试在验证之前添加
线程。sleep(60000)
,以便在插入检查数据之前,测试将等待1分钟。虽然这不是最好的解决方案,但根据您的Cassandra设置和配置,可能仍然会失败。我已经尝试使用
Thread.sleep()
即使我花了2分钟也不起作用我无法更改原始方法功能您可以在验证之前尝试添加
Thread.sleep(60000)
,因此,在插入检查数据之前,测试将等待1分钟。虽然这不是最好的解决方案,但根据您的Cassandra设置和配置,可能仍然会失败。我已经尝试使用
Thread.sleep()
即使我花了2分钟,它也不起作用