Я написал интеграционный тест с использованием Citrus Framework для службы Spring Boot, которая взаимодействует через HTTP REST.
Мне удалось внедрить некоторые из "методов" проверки Citrus в JSON для обработки ситуаций. как @isNumber()@
для отметок времени, которые всегда меняются. Однако я столкнулся с проблемой, когда попытался выполнить некоторые другие.
В JSON есть еще одно поле (commandID
), которое содержит UUID и может измениться от одного вызова к другому. Сначала я решил использовать @match("<regex>")@
для сопоставления с шаблоном UUID, а когда это вызвало проблему, переключился на попытку использовать @ignore@
, но это также привело к той же проблеме.
Вот ошибка из console:
13:29:21.962 [main] ERROR com.consol.citrus.report.LoggingReporter - TEST FAILED MissionPlannerIT.testPlanMission <edu.mit.ll.mission_services.service.mission_planner> Nested exception is:
com.consol.citrus.exceptions.TestCaseFailedException: Validation failed: Values not equal for header element 'Accept', expected 'application/json' but was 'application/json,application/*+json'
Я не знаю, в чем здесь проблема, и как ее устранить.
gen-route-command. json:
{
"header": {
"timestamp": "@isNumber()@",
"typeID": "edu.mit.ll.mission_services.messages.GenerateRouteCommand",
"transaction": {
"id": 1,
"startTime": "@isNumber()@"
},
"signature": {
"algorithm": null,
"keySize": 0,
"keyValue": null,
"sender": null
}
},
"commandID": "@ignore@",
"commandType": "GENERATE_ROUTE"
}
Функции @isNumber()@
работают и позволяют сопоставлению этих элементов проходить проверку. @ignore@
, однако нет. Я пробовал с обоими вариантами: @ignore@
и @ignore()@
, ни один не работает. Как упоминалось ранее, @match(...)@
также не работает.
ОБНОВЛЕНИЕ :
Я изменил некоторые параметры, чтобы попытаться выполнить проверку в коде тестового примера. Я изменил значение в JSON обратно на UUID.
runner.http(builder -> builder
.server(routeGeneratorServer)
.receive()
.post("/v1/missionServices/missionPlanning/generateRoute")
.accept(ContentType.APPLICATION_JSON.getMimeType())
.payload(new ClassPathResource("templates/gen-route-command.json"))
.validate("$.commandID", "@ignore@"));
gen-route-command. json:
{
"header": {
"timestamp": "@isNumber()@",
"typeID": "edu.mit.ll.mission_services.messages.GenerateRouteCommand",
"transaction": {
"id": 1,
"startTime": "@isNumber()@"
},
"signature": {
"algorithm": null,
"keySize": 0,
"keyValue": null,
"sender": null
}
},
"commandID": "0710d523-43da-4f68-90c7-a2b4544a955d",
"commandType": "GENERATE_ROUTE"
}
К сожалению, это не работает. Я получаю сообщение об ошибке, которую я первоначально пытался смягчить с помощью @ignore@
или @match(...)@
.
14:12:57.299 [main] ERROR com.consol.citrus.report.LoggingReporter - TEST FAILED MissionPlannerIT.testPlanMission <edu.mit.ll.mission_services.service.mission_planner> Nested exception is:
com.consol.citrus.exceptions.TestCaseFailedException: Failed to validate JSON text:
{"header":{"timestamp":1581016372132,"typeID":"edu.mit.ll.mission_services.messages.GenerateRouteCommand","transaction":{"id":1,"startTime":1581016372130},"signature":{"algorithm":null,"keySize":0,"keyValue":null,"sender":null}},"commandID":"9302ebde-894b-43a3-b7a3-92a158c7170e","commandType":"GENERATE_ROUTE"} Values not equal for entry: 'commandID', expected '0710d523-43da-4f68-90c7-a2b4544a955d' but was '9302ebde-894b-43a3-b7a3-92a158c7170e'
Значения commandID
отличаются, поскольку при каждом запуске генерируется новый UUID.
Похоже, что проверка в тесте не "игнорирует" значение, а вместо этого проверка JSON помечает различия UUID.