首页 > 解决方案 > Spock:模拟 mongodb 批量更新,数组比较失败

问题描述

我正在尝试对一些使用 mongodb 批量更新的代码进行单元测试。

的数组UpdateOneModel是在使用 java 流的方法中构造的:

updates = myArray.stream().map(createBulkUpdate)
    .collect(Collectors.toList());

return userRepository.bulkUpdate(session, updates);

尝试在 spock 测试中验证这一点时:

then:
1 * userRepository.bulkUpdate(session, [
    new UpdateOneModel<User>(new Document(), new Document())
])

我最终得到以下错误:

1: argument == expected
   |        |  |
   |        |  [UpdateOneModel{filter=Document{{}}, update=Document{{}}, options=UpdateOptions{upsert=false, bypassDocumentValidation=null, collation=null, arrayFilters=null}}] (java.util.ArrayList@5dc44d03)
   |        false
   [UpdateOneModel{filter=Document{{}}, update=Document{{}}, options=UpdateOptions{upsert=false, bypassDocumentValidation=null, collation=null, arrayFilters=null}}] (java.util.ArrayList@2dbc6d0a)

在这两种情况下,查询的字符串表示形式完全相同。只是数组的地址似乎不同。我简化了整个测试,只使用空文档而不是实际查询,以便在调试期间排除查询本身的任何差异。

通常 spock 可以很好地处理数组及其内容,所以我对此失败并不感到惊讶。

任何想法为什么会失败或如何使其工作?或者更好的想法来测试类似的东西(理想情况下我不必模拟数据库,但目前我没有看到如何实现这一点的好方法)?

标签: mongodbspock

解决方案


推荐阅读