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

Mac*_*der 5 java rest json http rest-assured

让我们假设我有以下模型:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MyModel {
    private Object field; //required field
    private Object anotherField; //optional field
}
Run Code Online (Sandbox Code Playgroud)

现在我想验证我的 REST 端点是否正常工作(只需要必填字段),所以我想执行以下 2 个请求并检查它们是否导致 200:

{
    "field": "someValue",
    "anotherField": null
}
Run Code Online (Sandbox Code Playgroud)

和:

{
    "field": "someValue"
}
Run Code Online (Sandbox Code Playgroud)

第一个,代码很简单:

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

但第二个开始有点蹩脚。如果我不为 提供值anotherField,默认情况下它将为空,这就是将通过 REST(第一个 TC)发送的内容。但此刻我不想发送这个字段。换句话说:

我希望 RestAssured 不要发送nulls. 有什么方法可以实现吗?

Adr*_*ian 5

如果您使用的是 Jackson 库:

@JsonInclude(Include.NON_NULL)
Run Code Online (Sandbox Code Playgroud)

使用此注释可以指定简单的排除规则以减少要写出的属性数量


Mac*_*der 2

问题解决了。经过一番调查后,我发现有两种解决此问题的方法:

  1. 自定义 resassured 使用的映射器:如何访问 REST Assured 中的底层 Jackson ObjectMapper?

  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);
Run Code Online (Sandbox Code Playgroud)