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

rest
json
java
rest-assured
Теги: #<Tag:0x00007fedc7b1bb58> #<Tag:0x00007fedc7b1b978> #<Tag:0x00007fedc7b1b7c0> #<Tag:0x00007fedc7b1b5b8>

#1

Есть такой 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 с одинаковыми параметрами ?


(Egor Ryaboshapko) #2

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


#3

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

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


#4

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


(Nikita) #5

можешь ещё посмотреть в сторону 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");