Я пытаюсь определить контракт CDC с помощью Spring-Cloud-Contract следующим образом:
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_\\- ]*");
Но в своих тестах я хочу разрешить, чтобы массив разделов был пустым, как в первом примере. Теперь, если моя тестовая реализация возвращает пустой массив разделов, сгенерированные тесты завершатся неудачно, потому что не могут найти идентификатор разделов для пустого массива.
Parsed JSON [[{"code":"WeekendKrant","name":"De Morgen Weekend","sections":[]}]]
doesn't match the JSON path [$[*].sections[*][?(@.id =~ /([0-9a-f]{8})?/)]]
Я также пробовал с необязательным(), но единственная разница в том, что регулярное выражение включает '?' в конце. Утверждение JSON по-прежнему не выполняется.
В заглушках возвращаются оба результата, но для теста я хочу, чтобы тест был успешным и для обоих. Являются ли тестовые утверждения чисто генерируемыми при последнем появлении каждого атрибута? Нет ли возможности иметь что-то вроде «необязательно()» в массиве?