【问题标题】:Wiremock: how to validate ALL objects in an arrayWiremock:如何验证数组中的所有对象
【发布时间】:2021-08-12 12:32:32
【问题描述】:

使用wiremock-standalone(2.29.1 版),我想验证一个请求,它的主体包含一个对象数组,包含可选属性。

例如,考虑这个请求:

请求正文(JSON 格式)

    { 
      "foo": [ 
        { "bar": "1" },
        { "qux": "oh hai" },
        { "bar": "ohnoes" }
      ]
    }

假设我只想在所有foo.bar 属性都存在或仅包含一个数字时才匹配请求(这只是为了举例)。上面的例子不应该匹配(第三个对象有一个bar 属性和非数字字符)。

我尝试了不同的方法,我得到的最接近的是:

{ 
  "matchesJsonPath": {
    "expression": "$.foo[*].bar",
    "or": [
      { "matches": "^\\d$" },
      { "absent": true }
    ]
  }
}

有2个问题:

  • 如果根本没有bar属性,则请求不匹配
  • 如果至少有 1 个bar 属性通过检查,则整个请求通过,即使其他bar 值无效(上述示例通过)

有人知道如何在wiremock中创建这样的规则吗?

【问题讨论】:

  • 所以你的请求正文是一个 JSON 对象数组,可以包含 fieldA 或 fieldB?并且您想在每个 JSON 对象中找到 fieldA 或 fieldB 时进行匹配?

标签: wiremock wiremock-standalone


【解决方案1】:

我找到了一个可能的解决方案,也许不是最简单的,但它确实有效。

按照你的例子:

请求:

{ 
  "foo": [ 
    { "bar": "1" },
    { "qux": "oh hai" },
    { "bar": "ohnoes" }
  ]
}

这个 bodyPatterns 文件用于验证每个字段是否存在并且它具有给定的值:

"bodyPatterns" : [

      {
        "matchesJsonPath": "$.foo[?(@.bar == '1')]"
      },

      {
        "matchesJsonPath": "$.foo[?(@.qux == 'oh hai')]"
      },

      {
        "matchesJsonPath": "$.foo[?(@.bar == 'ohnoes')]"
      }
]

作为参考,下面的帖子对我帮助很大:

Wiremock matchesJsonPath checking array values ignoring the order

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 2021-05-18
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多