我試圖定義使用Spring的雲合同這樣的CDC合同:爲可能的空數組定義合同?
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
url $(client(~/\/categories\?publication=[a-zA-Z-_]+?/), server('/categories?publication=DMO'))
}
response {
status 200
headers {
header('Content-Type', 'application/json;charset=UTF-8')
}
body """\
[{
"code": "${value(client('DagKrant'), server(~/[a-zA-Z0-9_-]*/))}",
"name": "${value(client('De Morgen Krant'), server(~/[a-zA-Z0-9_\- ]*/))}",
"sections" : []
},
{
"code": "${value(client('WeekendKrant'), server(~/[a-zA-Z0-9_-]*/))}",
"name": "${value(client('De Morgen Weekend'), server(~/[a-zA-Z0-9_\- ]*/))}",
"sections" : [
{
"id" : "${value(client('a984e824'), server(~/[0-9a-f]{8}/))}",
"name" : "${value(client('Binnenland'), server(~/[a-zA-Z0-9_\- ]*/))}"
}
]
}]
"""
}
}
在生成的測試中,這將導致以下斷言:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).array().contains("code").matches("[a-zA-Z0-9_-]*");
assertThatJson(parsedJson).array().array("sections").contains("id").matches("([0-9a-f]{8})?");
assertThatJson(parsedJson).array().array("sections").contains("name").matches("[a-zA-Z0-9_\\- ]*");
assertThatJson(parsedJson).array().contains("name").matches("[a-zA-Z0-9_\\- ]*");
但在我的測試中我想允許節數組是空的,就像第一個例子。現在,如果我的測試實現返回空節數組,則生成的測試失敗,因爲它無法爲空數組找到節的ID。
Parsed JSON [[{"code":"WeekendKrant","name":"De Morgen Weekend","sections":[]}]]
doesn't match the JSON path [$[*].sections[*][?(@.id =~ /([0-9a-f]{8})?/)]]
我也試圖與可選的(),但唯一不同的是,正則表達式包含「?」最後。 JSON斷言仍然失敗。
在存根中,兩個結果都會返回,但對於測試,我希望測試也能成功。測試斷言純粹是在每個屬性的最後一次出現時生成的嗎?有沒有可能在數組上有'optional()'之類的東西?
一個說明,但...如果你挑選的匹配選項,您必須手動如果需要,可以事後匹配整塊 –