1

我正在尝试创建一个junit测试。设想:

  • 设置:我正在向数据库添加两个 json 文档
  • 测试:我正在使用视图获取这些文档
  • tearDown:我正在删除两个对象

我的观点:

function (doc, meta) {
  if (doc.type && doc.type == "UserConnection") {
    emit([doc.providerId, doc.providerUserId], doc.userId);
  } 
}


这就是我将这些文档添加到数据库并确保“添加”是同步的方式:

public boolean add(String key, Object element) {
    String json = gson.toJson(element);
    OperationFuture<Boolean> result = couchbaseClient.add(key, 0, json);
    return result.get();
}


我添加的 JSON 文档是: {"userId":"1","providerId":"test_pId","providerUserId":"test_pUId","type":"UserConnection"} {"userId":"2" ,"providerId":"test_pId","providerUserId":"test_pUId","type":"UserConnection"}

这就是我所说的视图:

View view = couchbaseClient.getView(DESIGN_DOCUMENT_NAME, VIEW_NAME);
Query query = new Query();
query.setKey(ComplexKey.of("test_pId", "test_pUId"));
ViewResponse viewResponse = couchbaseClient.query(view, query);


问题:

  • 由于从视图中提取的元素数量无效,测试失败。

我的观察:

我的问题:

  • 在将数据插入数据库之后,我如何从视图中获取数据有什么问题吗?有没有解决这个问题的好习惯?有人可以向我解释一下我做错了什么吗?

谢谢,
大流士

4

1 回答 1

1

在 Couchbase 2.0 中,文档需要先写入磁盘,然后才能显示在视图中。您可以通过三种方式使用 Java SDK 进行操作。第一个是异步的,这意味着您只需发送数据,然后再检查以确保正确接收到数据。如果您执行异步操作,然后像上面那样立即调用 .get() ,那么您已经创建了一个同步操作。当操作在上述两种情况下返回成功时,您只能保证该项目已写入内存。您的测试通过有时只是因为您很幸运,这两个项目在您的查询之前都已写入磁盘。

第三种执行操作的方法是具有耐久性要求,这是您要为测试执行的方法。持久性要求允许您说您希望在成功返回客户端之前将项目写入磁盘或复制。看看下面的函数。

https://github.com/couchbase/couchbase-java-client/blob/1.1.0/src/main/java/com/couchbase/client/CouchbaseClient.java#L1293

您将需要使用此函数并将 PersistedTo 参数设置为 MASTER。

于 2013-02-26T18:01:36.160 回答