与具有嵌套数组的请求正文的合同

Contract with request body having a nested array

我有这份合同

org.springframework.cloud.contract.spec.Contract.make {
    request {
        method 'POST'
        url ('/v1/foo') {
            body([
                    fooList: [[
                        id: anyUuid()
                    ]]
            ])
        }
        headers {
            contentType applicationJson()
        }
    }
    response {
        status OK()
    }
}

当我像下面这样使用 Postman 对其进行测试时,它按预期工作

{
    "fooList": [
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b860" },
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b861" }
    ]
}

但是当我试图让它失败并像下面那样只更改一个 id 时它也有效!!

{
    "fooList": [
        { "id": 1 },
        { "id": "dd2b602a-5052-4203-9e8c-3f1dfb49b861" }
    ]
}

就在所有id都不正确的时候失败了!!

{
    "fooList": [
        { "id": 1 },
        { "id": 1 }
    ]
}

像这样

                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
POST                                                       | POST
/v1/processOdr                                             | /v1/processOdr
                                                           |
Content-Type [matches] : application/json.*                | Content-Type: application/json
                                                           |
$.['fooList'][*][?(@.['id'] =~                             | {                                                   <<<<< Body does not match
/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]  |     "fooList": [
{12}/)]                                                    |         {
                                                           |             "id": 1
                                                           |         },
                                                           |         {
                                                           |             "id": 1
                                                           |         }
                                                           |     ]
                                                           | }
                                                           |
-----------------------------------------------------------------------------------------------------------------------

如何使用具有嵌套数组的请求主体处理这种情况?

生成的 jsonpath 会搜索与正则表达式匹配的任何元素。这意味着至少有一个。如果您需要它们全部匹配,您可以通过 spring.cloud.contract.verifier.assert.size 属性 使用数组大小​​检查。您可以在下面的文档中找到有关此内容的条目

验证 JSON 数组大小的支持是实验性的。如果要打开它,请将以下系统属性的值设置为true:spring.cloud.contract.verifier.assert.size。默认情况下,此功能设置为 false。您还可以在插件配置中设置 assertJsonSize 属性。