在mongodbjava中验证密钥的值

hjqgdpho  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(246)

我到处找了,但还没有找到一个简单而有效的方法。
任务:我是一个qa,我试图验证特定的键在mongodb文档中是否具有预期的值。如果不是,则Assert为false。
我的问题是:我的文档包含数组和文档。在ui中使用点符号(例如item.fruit.apples.type.macintosh)很容易遍历树。但在java中,我唯一能做到这一点的方法是显式地告诉它item、fruit、apples、type还是macintosh是文档还是数组。例如:

{
    "item": {
        "fruit",
        "apples"[
            "type": "macintosh",
            ]
    }
}
Document fruit  = doc.getEmbedded(List.of(item, fruit), Document.class);

List<Document> apples = (List<Document>) fruit.get(apples);
for (Document apple : apples) {
    actualValue = apple.getString("type");
    }
if(!actualValue.equals(expectedValue)) {
    Assert.fail();
    }

如果开发人员决定更改或删除任何密钥,我的验证将中断。难道没有更简单的方法吗?

jq6vz3qz

jq6vz3qz1#

在其他stackoverflow帖子的帮助下,我找到了解决方案:

private static Object getWithDotNotation(Document doc, String key)
            throws MongoException {

        String[] keys = key.split("\\.");

        for (int i = 0; i < keys.length - 1; i++) {
            Object o = doc.get(keys[i]);
            if (o == null) {
                throw new MongoException(String.format(
                        "Field '%s' does not exist or is not a Document", keys[i]));
            }
            if (o instanceof ArrayList) {
                ArrayList<?> docArrayNested = (ArrayList<?>) o;
                for (Object docNestedObj : docArrayNested) {
                    if (docNestedObj instanceof Document) {
                        doc = (Document) docNestedObj;
                    }
                }
            } else {
                doc = (Document) o;
            }
        }
        return doc.get(keys[keys.length - 1]);
    }

这是我用点表示法迭代键和值的函数:

HashMap<String, Object> map = new HashMap<>();
        map.put("item.fruit.apples.type", "macintosh");

        FindIterable<Document> iterable = c.find(query);

        map.forEach((key, value) -> {

            for (Document doc : iterable) {
                Object expectedValue = map.get(key);
                Object actualValue;

                actualValue = getWithDotNotation(doc, key);

                if (!actualValue.equals(expectedValue)) {
                    System.out.println("Verification Failed:: Expected value for " + key + ": " + expectedValue + ". Actual value: " + actualValue);
                    Assert.assertTrue(false);
                } else {
                    System.out.println("Verification passed:: " + key + ": " + actualValue);
                }

            }
        });
    }

相关问题