我的单元/集成测试包括对搜索功能的测试。
我的想法是在每次测试之前都有一个空的搜索索引。因此,我正在尝试在setup
方法中删除索引中的所有元素(这是Groovy代码):
Client client = searchConnection.client
SearchResponse response = client.prepareSearch("item")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(termQuery('name', 'test')) //tried also matchAllQuery()
.setFrom(0).setSize(100).setExplain(false).execute().actionGet()
List<String> ids = response.hits.hits.collect {
return it.id
}
client.close()
client = searchConnection.client
ids.each {
DeleteResponse delete = client.prepareDelete("item", "item", it)
.setOperationThreaded(false)
.execute().actionGet()
}
client.close()
看起来它正在异步处理所有的删除操作,所以我在此之后添加了Thread.sleep(5000)
。正如你所看到的,我正在尝试打开/关闭连接几次 - 它对此没有帮助。
问题在于有时需要更多时间,有时需要超过5秒才能完成删除,有时无法找到刚添加的数据(从上一个测试中),等等。最令人烦恼的是,集成测试变得不稳定。在可能的地方放置Thread.sleep()
看起来并不是很好的解决方案。
是否有任何方法可以提交最近的更改,或者在所有数据被写入之前进行锁定?