Java 如何匹配MockMvc Spring测试中的对象列表?

Java 如何匹配MockMvc Spring测试中的对象列表?,java,json,spring,mockmvc,Java,Json,Spring,Mockmvc,我有一个MockMVC测试,它返回一个对象列表。我正在尝试检查此特定属性是否设置正确 但是,除了显式地添加它之外,我无法使用任何方式使它匹配。KeyPair是一个简单的pair类,具有键值,非常类似于映射的条目 List<KeyPair<String, String>> keyList = User.getContactDetails() .entrySet() .stream() .map( e -> ne

我有一个MockMVC测试,它返回一个对象列表。我正在尝试检查此特定属性是否设置正确

但是,除了显式地添加它之外,我无法使用任何方式使它匹配。KeyPair是一个简单的pair类,具有键值,非常类似于映射的条目

     List<KeyPair<String, String>> keyList = User.getContactDetails()
        .entrySet()
        .stream()
        .map( e -> new KeyPair<String, String>( e ) )
        .collect( Collectors.toList() );

      performQueryWithHeaders( get( "/users/1" ) )
            .andExpect( status().isOk() )
            .andExpect( jsonPath( "$.contactDetails" ,
                  is( keyList ) ) );
List keyList=User.getContactDetails()
.entrySet()
.stream()
.map(e->新密钥对(e))
.collect(Collectors.toList());
performQueryWithHeaders(get(“/users/1”))
.andExpect(状态().isOk())
.andExpect(jsonPath(“$.contactDetails”),
是(keyList);;
我试过几种选择

is(密钥列表)

是(keyList.toString())

is(Gson.toJson(keylist)

is(mapper.writeValueAsString(键列表)(jackson序列化)

但是,不断收到不同的不匹配消息:

    JSON path "$.contactDetails"
Expected: is "[{\"key\":\"example title\",\"value\":\"example title\"},    {\"key\":\"another example\",\"value\":\"another example\"},{\"key\":\"etc \",\"value\":\"etc \"}]"
     but: was <[{"key":"example title","value":"example title"},{"key":"another example","value":"another example"},{"key":"etc ","value":"etc "}]>

 JSON path "$.contactDetails"
Expected: is <[KeyPair(key=example title, value=example title), KeyPair(key=another example, value=another example), KeyPair(key=etc , value=etc )]>
 but: was <[{"key":"example title","value":"example title"},{"key":"another example","value":"another example"},{"key":"etc ","value":"etc "}]>

 JSON path "$.contactDetails"
Expected: is "[KeyPair(key=example title, value=example title), KeyPair(key=another example, value=another example), KeyPair(key=etc , value=etc )]"
 but: was <[{"key":"example title","value":"example title"},{"key":"another example","value":"another example"},{"key":"etc ","value":"etc "}]>

 JSON path "$.contactDetails"
Expected: is "[{\"key\":\"example title\",\"value\":\"example title\"},{\"key\":\"another example\",\"value\":\"another example\"},{\"key\":\"etc \",\"value\":\"etc \"}]"
 but: was <[{"key":"example title","value":"example title"},{"key":"another example","value":"another example"},{"key":"etc ","value":"etc "}]>
JSON路径“$.contactDetails”
应为“[{”键\“:\”示例标题\“,\”值\“:\”示例标题\“},{”键\“:\”另一个示例\“,\”值\“:\”另一个示例\“},{”键\“:\”等\“,”值\“:\”等\“}”
但是:是吗
JSON路径“$.contactDetails”
预期:是吗
但是:是吗
JSON路径“$.contactDetails”
应为“[KeyPair(key=示例标题,value=示例标题),KeyPair(key=另一个示例,value=另一个示例),KeyPair(key=etc,value=etc)]”
但是:是吗
JSON路径“$.contactDetails”
应为“[{”键\“:\”示例标题\“,\”值\“:\”示例标题\“},{”键\“:\”另一个示例\“,\”值\“:\”另一个示例\“},{”键\“:\”等\“,”值\“:\”等\“}”
但是:是吗

我不想在测试中编写json,因为它看起来有点垃圾/脆弱。那么有人知道如何映射它吗?

问题是JsonPath将
$解析为字符串。contactDetails
将其与列表进行比较。您可以将
键列表
转换为字符串,然后进行比较

在解析
$.contactDetails
列表的情况下,我可以向库提供建议

import java.lang.reflect.Type;
导入com.google.gson.reflect.TypeToken;
// ...
类型listType=newTypeToken(){}.getType();
List yourList=new Gson();
试试这个

performQueryWithHeaders( get( "/users/1" ) )
            .andExpect( status().isOk() )
            .andExpect( gson.toJson(jsonPath( "$.contactDetails") ,
                  is( gson.toJson(keyList ) ) );
问题似乎如下
jsonPath(“$.contactDetails”)
gson.toJson(keyList)时返回JsonObject类型的结构
返回一个包含Json的字符串,其中包含转义完成的引号。

我不完全确定如何将其更改为所需的字符串。我尝试了.toString,然后使用gson.toJson和jackson对象映射器将其序列化为Json,但仍然无法正确映射。
performQueryWithHeaders( get( "/users/1" ) )
            .andExpect( status().isOk() )
            .andExpect( gson.toJson(jsonPath( "$.contactDetails") ,
                  is( gson.toJson(keyList ) ) );