Pact Contract Test: Как сгенерировать динамический PactDslJsonBody, используя значение json?

Как сгенерировать динамический PactDslJsonBody, используя значение json? Возможно ли, что команда Pact может предоставить автостроителю динамическое назначение тела?

Тело Пакта:

body(new PactDslJsonBody()
                .object("testsuite") 
                .stringType("webId","24255")  
                .closeObject());        

Подтвердить ответ:

"{\"testsuite\":{\"webId\":\"24255\"}}";

На основе ответа Assert (в качестве входных данных) и создания dslbody как

String json = "{\"testsuite\":{\"webId\":\"24255\"}}"

//body(json);
body(generatePactDSLJsonBody(json));        

Подтвердить ответ:

assertEqual("{\"testsuite\":{\"webId\":\"24255\"}}",json);

Я знаю, что в теле мы можем предоставить JSON сам. но мне нужно сгенерировать тело PactDSLJson, используя Json.

1 ответ

Решение

Технически возможно автоматически генерировать классы DSL из документа JSON, но я не вижу преимущества вашего примера. В большинстве случаев сопоставители определяются на основе семантики полезной нагрузки JSON, а не синтаксиса.

Например, из вашего примера JSON он увидит атрибут webId в виде строки и сгенерирует совпадение строкового типа. Тем не менее, это явно число, а не строка.

Автоматически сгенерированное тело DSL будет принимать следующий JSON:

{"testsuite":{"webId":"This is not a web ID &^*&^%"}}

Тем не менее, инструмент автоматической генерации, используемый для создания скелетного потребительского теста из документа JSON, который затем может быть изменен на основе семантики JSON, был бы действительно полезен.

Мы создаем библиотеку для генерации PactDslJsonBodyиз Java Bean. Это не совсем ваш вариант использования, поскольку вы хотите использовать JSON в качестве входных данных, но, возможно, вы разработали свои конечные точки для предоставления Java Beans, чтобы вы могли использовать их для своих Пактов.

Возможно, вы захотите взглянуть на https://github.com/remondis-it/pact-consumer-builder.

С помощью этой библиотеки вы можете определить PactDslJsonBodyсопоставления по полю или по типу. В нашем случае это сокращает стандартный код почти до однострочного:

PactDslJsonBody jsonBody = ConsumerExpects.type(YOUR_BEAN_TYPE.class)
   .useTypeMapping(...)
   // Other field or type configurations
   .build(new PactDslJsonBody(), YOUR_BEAN_SAMPLE_INSTANCE);

Это выполняет необходимые вызовы PactDslJsonBody и вы можете использовать результат для своего теста Пакта.

Кстати: библиотека Pact Consumer Builder хорошо работает в сочетании с генератором фикстур, который создает экземпляры тестовых данных для Java Beans. Вы можете использовать наш генератор фикстур (https://github.com/remondis-it/resample), но любой другой генератор экземпляров Java Bean также должен работать.

Другие вопросы по тегам