rest assured: как передать в post body дублирующиеся параметры ?

Есть такой JSON

{"list_request":[{
		   "client_id":"111",
	           "phone":"111111111"
	          },
		 {
		    "client_id":"222",
		    "phone":"22222222"
		  },
		 {
		    "client_id":"333",
		    "phone":"33333333"}]
}

передаю его в body через hashmap:

     Map<String,String> verifyData = new HashMap<>();
        verifyData.put("client_id", "111");
        verifyData.put("phone", "111111111");
        verifyData.put("client_id", "222");
        verifyData.put("phone", "22222222");
        verifyData.put("client_id", "333");
        verifyData.put("phone", "33333333");

response = expect().statusCode(200)
                .given().spec(spec)
                .body(verifyData)
                .when()
                .post("/create");
        getResponseBody();

Естественно, при запуске, хешмапа каждый раз перезаписывает одинаковый ключи и выдает последний массив
Body: { "phone": "33333333", "client_id": "333" }
а создавать новый обьект хешмап под каждый массив [client_id, phone] не очень нормально.
Как создать нормальный post body с одинаковыми параметрами ?

1 лайк

HashMap реализует концепцию : уникальный ключ - значение.
Не может быть два ключа с одним и тем же именем

  1. Использовать разные ключи
  2. Использовать не HashMap<String,String>, а HashMap<String,Array>.
    Тут считываем по ключу массив, и добавляем в него новое значение
    что-то вроде
class Phone{
  String id;
  String number;
public Phone(String id,String number){}
//реализация класса (геттеры, сеттеры)
}
...
List<Phone> list=new ArrayList<Phone>();
HashMap<String,List<Phone>> map=new HashMap<>();
void add value(){
  put(phone,list);
  //добавление новых значение
  get(phone).add(new Phone(параметры в конструктор));
}

3. Поменять логику избавившись от HashMap

Как вариант(если нужны именно мапы):

List<Map> list = ImmutableList.of(
                ImmutableMap.of("client_id", "111", "phone", "111111111"),
                ImmutableMap.of("client_id", "222", "phone", "22222222"),
                ImmutableMap.of("client_id", "333", "phone", "33333333"));

response = expect().statusCode(200)
                .given().spec(spec)
                .body(ImmutableMap.of("list_request", list))
                .when()
                .post("/create");

Immutable List/Map из com.google.guava , можно использовать обычные List/Map

хороший вариант, спасибо
но я нашел более аккуратный способ через загрузку из YAML файла
кому интересно http://yamlbeans.sourceforge.net/

можешь ещё посмотреть в сторону http://www.jsonschema2pojo.org/

Генеришь себе pojo класс.
И дальше работаешь с обычным java объектом.

List<ListRequest> list = new ArrayList();
list.add(new ListRequest().withClientId(1).withPhone(111));
JsonObject object = new JsonObject().withListRequest(list);

expect().statusCode(200)
                .given().spec(spec)
                .body(object)
                .when()
                .post("/create");
2 лайка

что подразумевалось под withListRequest?

Скорее всего это ExtensionMethod, сотканный с помощью lombok, в котором автор создает JsonObject с полями из ListRequest.
Используйте Gson::toJson для сериализации объекта в json-строку. Либо ObjectMapper::writeValueAsString если используется jackson-databind.