Citrus Framework - Попытка использовать валидатор в JSON вызывает ошибку с заголовком ACCEPT - PullRequest
0 голосов
/ 06 февраля 2020

Я написал интеграционный тест с использованием 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.

1 Ответ

0 голосов
/ 07 февраля 2020

Казалось бы, "цитрусовые" функции ", встроенные в JSON, не были проблемой. Проблема заключалась в том, что я не устанавливал заголовки Accept и Content-Type в сообщении, которое служба POSTing принимала для вызова Citrus. Поскольку приемный вызов был настроен на поиск типа сообщения application/json, он завершался сбоем, поскольку в моем сообщении вообще не было заголовков (это мое впечатление).

Вызов Citrus:

// Set route generator to receive and validate generate route command.
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")));

Полученное сообщение «генерировать команду маршрута» не имеет определенных заголовков. Как только я установил заголовки Accept и Content-Type на application/json, тест мог быть продолжен.

...