当前位置: 首页 > 知识库问答 >
问题:

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

商天逸
2023-03-14

我有一个返回对象列表的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 ) ) );

我尝试了几种选择

is( keyList )

is( keyList.toString() )

是(Gson.toJson(keylist)

is(mapper . writevalueasstring(key list)(杰克逊序列化)

然而,不断得到不同的不匹配信息:

    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,因为看起来有点垃圾/脆弱。有人知道如何绘制地图吗?

共有2个答案

赫连俊雄
2023-03-14

试试这个

performQueryWithHeaders( get( "/users/1" ) )
            .andExpect( status().isOk() )
            .andExpect( gson.toJson(jsonPath( "$.contactDetails") ,
                  is( gson.toJson(keyList ) ) );

问题似乎如下所示< code > JSON path($。contactDetails")返回JsonObject类型的结构,而< code > gson . to Json(key list)返回一个字符串,该字符串包含对引号进行转义的Json。

庄元龙
2023-03-14

问题是 JsonPath 将 $.contactDetails 解析为字符串,并将其与 List 进行比较

在解析$. contact细节列表的情况下,我可以建议Gson库

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
// ...
Type listType = new TypeToken<List<KeyPair<String, String>>>() {}.getType();
List<KeyPair<String, String>> yourList = new Gson().fromJson(JsonPath.parse("$.contactDetails")), listType);
 类似资料:
  • 我正在尝试测试我的上传我是usig Junit,Mockmvc和Spring 你能帮帮我吗? 错误堆栈跟踪: [org.springframework.test.context.support.dependencyinjectiontestexecutionlistener@361cb7a1]准备测试实例[endpoint.security.tests.uploadtest@6F7918F0]or

  • 我目前对Java和cucumber有一个问题。通过使用硒访问网站的元素,我想使用以下短语: 该示例非常简单,通过使用Java注释,可以很好地处理每个属性名 除了以下用例:属性名包含类似于的括号。 在使用Eclipse和JUnit时,使用包含类似括号的字符串的Cucumber测试甚至不能完全识别,而只能识别开头括号之前的字符串部分。有什么想法或解决方案吗?

  • 我正在尝试编写一个pact消费者测试来匹配下面的响应。 每个schedule对象由与一个简单正则表达式匹配的未知数量的键组成。但是我没有看到一种方法可以使用正则表达式来匹配键,同时将值映射到一个简单的布尔值。 但这需要一个新的对象作为值,而不是一个基元类型。 有没有办法在pact-jvm中指定映射到基元值的不精确键?

  • 我有一个正在测试的方法,它返回一个对象列表。。。例如“Person”对象。 我有一个“预期的最后名字”列表来验证结果。 我目前有一个工作测试,它循环遍历“expectedLastNames”中的名称,并断言每个名称都包含在“Person”对象列表中。与此类似(请注意,以下代码段位于Kotlin中): 当断言通过时,这非常有效,并验证了我的方法。然而,当测试失败时,这是非常麻烦的,因为一旦遇到缺少的

  • 问题内容: 测试(使用反射)最简单的方法是,给定方法(即java.lang.Method实例)是否具有返回类型,可以安全地强制转换为List ? 考虑以下代码段: 所有方法1、2、3均满足要求。对于method1进行测试非常容易(通过getGenericReturnType(),该方法返回ParameterizedType的实例),但是对于method2和3来说,并不是那么明显。我想通过遍历所有g

  • 使用Jest测试深层嵌套属性是否存在的最佳方法是什么。尝试以我想要的特定对象为目标将导致未定义的错误,因为其父对象不存在: 我应该以某种方式将这些连接起来,这样我就可以首先测试对象的存在,然后测试内部对象的存在吗?相当于在if语句中做这样的事情 或者像这样在一个元素上进行多个测试时,是否应该有单独的测试? 我也尝试过: 这有点管用?更好,但是需要我在测试文件中声明这个非常大的对象。这种非常深入的比