Позвольте мне предварить это, сказав, что я происхожу из опыта tnet и не слишком хорошо знаком с Java. Я пытаюсь свести к минимуму необходимость обновлять объекты контракта / DTO для потребителей, разделяя объекты, которые будут использоваться в качестве схемы для контроллера. Например, создание схемы с использованием openAPI:
mysample.yml
openapi: "3.0.2"
paths:
/mySampleEndpoint:
post:
operationId: sample
requestBody:
content:
application/json:
schema:
$ref: "https://remote.definition.for.sampleendpoint.request.definition.yml#components/schemas/SampleEndpointDefinition"
#response removed for brevity
Пока это работает прекрасно, но становится немного сложнее, когда я хочу писать тесты контракта. Я ожидал бы, что мои потребители будут генерировать свои запросы путем сериализации экземпляра этого общего объекта, и вместо того, чтобы писать объекты json для тела от руки, я хочу писать объекты запроса, сериализуя stati c последний экземпляр объект запроса.
Текущий способ создания теста контракта - через файл .yml или. groovy, я буду использовать формат groovy, поскольку я думаю, что в этом случае он более перспективен.
ContractCheckV1.groovy (as documented)
[
Contract.make{
request {
method: 'POST'
urlPath ('api/v1/mySampleEndpoint')
headers: {
header('Content-Type': 'application/json')
}
body( """
{
"foo": 1,
"bar": "value",
"baz": false
}
""")
}
response {
status 200
}
}
]
Довольно легко увидеть, что тело запроса может стать громоздким, если мы получим достаточно сложные объекты, поэтому я бы предпочел сделать что-то вроде этого. Приносим извинения, я буду использовать синтаксис C#, потому что он более лаконичен.
myTestDate.csJava //why am I doing this?
public static class myTestData () {
public static SampleEndpointDefinition testObject (){
return new SampleEndpointDefinition{
foo = 1,
bar = "value",
baz = false
};
}
}
И мы ожидаем использовать его в файле. groovy следующим образом:
ContractCheckV1.groovy //as desired
SampleEndpointDefinition successObject = myTestData.testObject();
ObjectMapper mapper = new ObjectMapper();
string successObjectJson = mapper.writeValueAsString(successObject);
[
Contract.make{
request {
method: 'POST'
urlPath ('api/v1/mySampleEndpoint')
headers: {
header('Content-Type': 'application/json')
}
body( successObjectJson )
}
response {
status 200
}
}
]
Похоже, что существует проблема порядка компиляции при попытке получить пакет для myTestData или SampleObjectDefinition из-за того, как сгенерированный код взаимодействует с этим. Я не уверен, как прогрессировать. Спасибо за любую помощь.