Отключить отправку пустых полей через Rest Assured во время выполнения

Предположим, что я получил следующую модель:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MyModel {
    private Object field; //required field
    private Object anotherField; //optional field
}

Теперь я хотел бы проверить, правильно ли работает моя конечная точка REST (ожидается только обязательное поле), поэтому я хотел бы выполнить следующие 2 запроса и проверить, приводят ли они к 200:

{
    "field": "someValue",
    "anotherField": null
}

а также:

{
    "field": "someValue"
}

С первым код прост:

MyModel payload = MyModel.builder().field("someValue").build();
when().contentType(ContentType.JSON).body(payload).put("http://my-service.com/myendpoint/").then().statusCode(200);

Но второй начинает немного хромать. Если я не укажу значение для anotherField, по умолчанию оно будет нулевым, и это то, что будет отправлено через REST (первые TC). Но в данный момент я не хочу отправлять это поле. Другими словами:

Я хочу, чтобы RestAssured не отправлял nulls. Есть ли способ добиться этого?


person Maciej Treder    schedule 10.07.2017    source источник


Ответы (3)


Если вы используете библиотеку Джексона:

@JsonInclude(Include.NON_NULL)

используя эту аннотацию, можно указать простые правила исключения, чтобы уменьшить количество свойств для записи.

person Adrian    schedule 10.07.2017

Проблема решена. После небольшого расследования я вижу два пути решения этой проблемы:

  1. Настройте картограф, используемый resassured: Как мне получить доступ лежащий в основе Jackson ObjectMapper в REST Assured?

  2. Перед отправкой сериализуйте мой объект в String.

Я выбрал второй вариант:

String payload;
//send model WITHOUT nulls
payload = new Gson().toJson(MyModel.builder().field("someValue").build());
when().contentType(ContentType.JSON).body(payload).put("http://my-service.com/myendpoint/").then().statusCode(200);

//send model WITH nulls
payload = new GsonBuilder().serializeNulls().create().toJson(MyModel.builder().field("someValue").build());
when().contentType(ContentType.JSON).body(payload).put("http://my-service.com/myendpoint/").then().statusCode(200);
person Maciej Treder    schedule 11.07.2017

Проблема здесь: private Object AnotherField; //необязательное поле.

Вы не определили это свойство как тип, допускающий значение NULL. В соответствии с вашим кодом это обязательное поле не обнуляемого типа. Вы должны добавить аннотации данных, чтобы определить его как тип, допускающий значение NULL.

person Community    schedule 10.07.2017