禁止在运行时通过 Rest Assured 发送空字段

Disable sending null fields via Rest Assured in runtime

假设我得到以下模型:

@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。有什么办法可以实现吗?

问题在这里:private Object anotherField; //可选字段.

您尚未将此 属性 定义为 可空类型 。根据您的代码,它是必填字段,不可空类型。您必须添加 数据注释 以将其定义为可空类型。

如果您使用的是 Jackson 库:

@JsonInclude(Include.NON_NULL)

using this annotation one can specify simple exclusion rules to reduce amount of properties to write out

问题已解决。经过一些调查后,我看到了解决此问题的两种方法:

  1. 定制放心使用的映射器:How do I access the underlying Jackson ObjectMapper in REST Assured?

  2. 发送前将我的对象序列化为字符串。

我选择了第二个选项:

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);