Как получить тело контракта из сериализованного объекта stati c? - PullRequest
1 голос
/ 14 июля 2020

Позвольте мне предварить это, сказав, что я происхожу из опыта 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 из-за того, как сгенерированный код взаимодействует с этим. Я не уверен, как прогрессировать. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 14 июля 2020

Если у вашего объекта была карта stati c, которую он должен вернуть (как тело json), вам не нужно сериализовать его в json. Вам достаточно передать эту карту в контракт.

Если, однако, вы не можете использовать карту и это должна быть структура, вы можете использовать groovy JsonOutput http://groovy-lang.org/json.html#_jsonoutput вместо средства сопоставления объектов, которое вам может понадобиться в пути к классам.

Также помните, что этот ваш класс должен присутствовать в пути к классам как на стороне потребителя, так и на стороне производителя. Здесь представлен пример (здесь jar с общим кодом https://github.com/spring-cloud-samples/spring-cloud-contract-samples/tree/master/common, а затем вы можете проверить, как производитель и потребитель настроены для ссылки на этот код.

...