PACT DSL .closeObject для иерархического формата, взаимодействие с файлом PACT, ответ

Я не могу использовать PACT DSL .closeObject() для форматирования ответа взаимодействия PACT. Я прошу предложений, как заставить это работать, или спрашиваю, работает ли .closeObject() не так, как предполагалось? У меня есть корзина с 2 товарами. Когда я пытаюсь отформатировать ожидаемый ответ с двумя элементами, используя .closeObject(), он не будет компилироваться, см. код ниже. Ошибка компиляции в первой .closeObject() строке после ".stringMatcher("name","iPhone"). Мне нужно создать иерархию shoppingCartItems, в файлах PACT ожидается ответ. Объявленное использование PACT DSL .closeObject() можно найти по этой ссылке в разделе «соответствие любому ключу в разделе карты» Примеры PACT DSL с использованием .closeObject()

private DslPart respSc6() {
    DslPart body = new PactDslJsonBody()
        .stringMatcher("id", "ShoppingCart_[0-9]*", "ShoppingCart_0")
        .eachLike("shoppingCartItem")               
        .numberValue("quantity", 1)
        .stringMatcher("state","new")
        .object("productOffering")                              
        .stringMatcher("id","IPHONE_7")
        .stringMatcher("name","iPhone")
        .closeObject()
        .numberValue("quantity", 5)
        .stringMatcher("state","new")               
        .object("productOffering")                                              
        .stringMatcher("id","SMSG_GLXY_S8")
        .stringMatcher("name","Samsung_Galaxy_S8")
        .closeObject()              
        .closeObject()
        .closeArray();
    return body;
}

Ожидаемая полезная нагрузка ответа JSON должна выглядеть так: Ожидаемая полезная нагрузка ответа PACT с иерархическими данными


person Pamela Wilson    schedule 18.04.2017    source источник
comment
Что такое сообщение об ошибке компиляции? Похоже, вы слишком много раз закрываете объект? Кроме того, у вас есть конечный closeArray, но вы нигде не начинаете массив. Я бы порекомендовал вам вместо этого использовать сопоставитель строк тела JSON, так как это немного упрощает задачу, чем создание объекта с помощью DSL.   -  person J_A_X    schedule 24.04.2017


Ответы (1)


Вот исправленный и аннотированный код, соответствующий вашему примеру JSON.

  private DslPart respSc6() {
    DslPart body = new PactDslJsonBody()
      .stringMatcher("id", "ShoppingCart_[0-9]*", "ShoppingCart_0")
      .eachLike("shoppingCartItem") // Starts an array [1] and an object [2] (like calling .object(...)) and applies it to all items
        .numberValue("quantity", 1)
        .stringMatcher("state", "new") // You are using a simple string as the regex here, so it will only match 'new'
        .object("productOffering") // Start a new object [3]
          .stringMatcher("id", "IPHONE_7") // Again, this regex will only match 'IPHONE_7'
          .stringMatcher("name", "iPhone") // Again, this regex will only match 'iPhone'
        .closeObject() // Close the object started in [3]
      .closeObject() // Close the object started in [2]
      .closeArray(); // Close the array started in [1]
    return body;
  }

Вам не нужно предоставлять два примерных определения объекта для массива shoppingCartItem, так как сопоставитель .eachLike предназначен для применения одного определения ко всем элементам массива. Если вы хотите, чтобы сгенерированный пример JSON содержал два элемента, передайте число два в качестве второго параметра, например. .eachLike("shoppingCartItem", 2).

person Ronald Holshausen    schedule 24.04.2017