junit Spring MockMvc:AssertJson字段为空数组或不存在

0aydgbwb  于 2023-08-05  发布在  Spring
关注(0)|答案(5)|浏览(131)

我正在使用MockMvc测试一个返回JSON内容的API,该JSON可能包含一个名为shares的字段作为空数组,也可能根本不存在(我的意思是shares字段)。
JSON示例:

{
    "id":1234,
     .....
    "shares":[]
}

//or

{
    "id":1234,
    ....
}

字符串
我怎么能Assert这个字段是空的或者不存在
例如:

mvc.perform(
    post("....url.......")
        .andExpect(status().is(200))
        // I need one of the following to be true, but this code will assert both of them, so it will fail
        .andExpect(jsonPath("$.shares").isEmpty())
        .andExpect(jsonPath("$.shares").doesNotExist())

ax6ht2ek

ax6ht2ek1#

这就是如何检查该字段在json payload中不存在。

.andExpect(jsonPath("$.fieldThatShouldNotExist").doesNotExist())

字符串
如果你想测试它是否存在并且是空的或者它不存在,你必须编写自己的自定义Matcher来创建一个类似XOR的行为。把这个答案当作一个指南。在Hamcrest中进行测试,该测试在具有特定属性的列表中仅存在一个项

nzkunb0c

nzkunb0c2#

查看JsonPath OR condition using MockMVC

.andExpect(jsonPath("$.isPass", anyOf(is(false),is(true))));

字符串

a7qyws3x

a7qyws3x3#

如果你有这样的东西:

{ "arrayFieldName": [] }

字符串
您可以用途:

.andExpect( jsonPath( "$.arrayFieldName", Matchers.empty() );


那个比较干净。

x759pob2

x759pob24#

为了捕获字段根本不在json主体中的情况,可以使用doesNotHaveJsonPath()

.andExpect(jsonPath("$.fieldThatShouldNotExistOrEvenBeNull").doesNotHaveJsonPath())

字符串
因此,如果您的shares字段不在body中,则此匹配器将通过。如果存在,则此匹配器将失败。

x6yk4ghg

x6yk4ghg5#

import static org.hamcrest.collection.IsEmptyCollection.empty;

.andExpect(jsonPath("$.isPass",empty() ));

字符串

相关问题