无法测试Cassandra execcuteAsync响应

时间:2018-09-21 07:20:50

标签: java junit cassandra

这是我的示例原始方法

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 future = session.executeAsync(insertStatement);

然后在下面添加语句

future.get()

然后我得到的表格大小有所不同,即1

2 个答案:

答案 0 :(得分:1)

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

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

executeAsync方法不会等待。

查询一经传递到基础网络堆栈,它就会立即返回。特别是,从此方法返回并不能保证查询有效,甚至不能提交给活动节点。访问ResultSetFuture时,将引发与查询失败有关的任何异常。来源:https://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/ResultSetFuture.html

答案 1 :(得分:1)

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