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

提取嵌套的 POJO 对象,放心

上官季
2023-03-14

我正在编写一些使用放心及其静态编程语言扩展的测试来测试一些简单的Spring MVCendpoint。我正在尝试了解如何提取值。

一个endpoint返回<code>BookDetailsView

< code>BookDetailsView是一个非常简单的Kotlin数据类,只有一个字段:

data class BookDetailsView(val id: UUID)

对于单个对象终结点,我有:

    @Test
    fun `single object`() {
        val details = BookDetailsView(UUID.randomUUID())

        whenever(bookDetailsService.getBookDetails(details.id)).thenReturn(details)
        val result: BookDetailsView = Given {
            mockMvc(mockMvc)
        } When {
            get("/book_details/${details.id}")
        } Then {
            statusCode(HttpStatus.SC_OK)
        } Extract {
            `as`(BookDetailsView::class.java)
        }
        assertEquals(details.id, result.id)
    }

这与预期的一样,但尝试对<code>页应用相同的技术

我尝试了各种排列,如下面的代码,只是为了抓住我关心的一点:

    @Test
    fun `extract nested`() {
        val page = PageImpl(listOf(
            BookDetailsView(UUID.randomUUID())
        ))
        whenever(bookDetailsService.getBookDetailsPaged(any())).thenReturn(page)

        val response = Given {
            mockMvc(mockMvc)
        } When {
            get("/book_details")
        } Then {
            statusCode(HttpStatus.SC_OK)
            body("content.size()", `is`(1))
            body("content[0].id", equalTo(page.first().id.toString()))
        } Extract {
            path<List<BookDetailsView>>("content")
        }
        println(response[0].javaClass)
    }

最后的<code>println。相反,如果我尝试实际使用该对象,我会得到<code>类java.util。LinkedHashMap不能强制转换为类BookDetailsView。与此相关的问题和答案很多,我理解这最终是底层JSON解析器不知道该做什么的问题,但我不清楚:

    < li >为什么“简单”案例分析没有问题? < li >传递给< code>path()函数的type param不应该告诉它使用什么类型吗? < li >第二种情况需要配置什么,或者 < li >是否有其他更有意义的抓取嵌套对象的方法?

深入分析代码,似乎这两种情况实际上可能使用不同的json解析器/配置(前者似乎坚持使用放心的json解析,而后者最终使用JsonPath?)

共有1个答案

广昊昊
2023-03-14

我不知道kotlin,但事情是这样的:

>

  • path()不知道列表中的元素,因此默认情况下它将是LinkedHashMap,而不是BookDetailsView.class

    为了克服它,您可以为此提供TypeResources。

    java示例

    List<BookDetailsView> response = ....then()
                    .extract().jsonPath()
                    .getObject("content", new TypeRef<List<BookDetailsView>>() {});
    

    Kotlin例子

    @Test
    fun `extract nested`() {
        var response = RestAssured.given().get("http://localhost:8000/req1")
                .then()
                .extract()
                .jsonPath()
                .getObject("content", object : TypeRef<List<BookDetailsView?>?>() {});
    
        println(response)
        //[{id=1}, {id=2}]
    }
    

  •  类似资料:
    • 如何获得[0]。。。,[4] 下面对象的参数值? 下面看到的对象是EntityManager的结果。createNativeQuery()。我想使用这些值创建一个POJO。我知道我可以用EntityManager。createNativeQuery(“SQL查询”,MyPOJO.class),但它只返回ID为的POJO,所有其他变量都为null?!我对如何获取物体的参数很感兴趣。 不可能将返回的对

    • 我必须修改一个大型Hibernate DetachedCriteria查询以获取一些附加关联。 我的对象图类似于下面的结构,我想获取与每辆车相关联的销售: 原因:org.hibernate.LazyInitializationException:未能懒散地初始化角色的集合:Car.Sales,没有会话或会话关闭 我四处搜寻,到目前为止没有找到任何例子或信息。Hibernate文档没有提供关于如何获

    • 我试图用我使用Gson()提取的POJO填充JTable。使用调试器,或者使用toString()将值打印到控制台,我可以看到对象的映射是成功的。我的问题在于用对象填充自定义Jtable。 问题:我的GUI包含一个按钮,它获取一个搜索字段,并将其发送到一个API,该API返回一个JSON响应,我正确映射了JSON,但我不知道如何将数据放入表中。 我尝试过的:addFillings()和insert

    • 问题内容: 因此,可以说JSON响应为: 当您必须首先访问数据时,如何获得值“ value1”和“ value2”? 如果字段位于根目录,那么我可以让该方法返回带有这些字段名称的POJO。 我基本上希望下面的工作。 问题答案: 您可以尝试以下代码,使用Gson库将json字符串转换为具有必填字段的Pojo对象。 或者,您可以定义嵌套的Pojo类来解析它。 编辑:尝试下面的代码以使用Retrofit

    • 我有一个带有嵌套字段的JSON: 我正在使用JSONPATH从嵌套中获取。 我已经将我的JSON文本粘贴到了http://jsonpath.com/这个网站上;并且在使用了这一行之后: 我得到了这个: 使用此行后: 我得到了这个: 我尝试返回(输出)的内容如下: 但是我找不到合适的语法来将这两个组合在一行中,并用一个JSONPATH查询返回它们。

    • 基于 那个东西的 以下是我目前所尝试的: 我想使用一个Java8流和两个getter的lambdas来完成这一操作,这两个getter最终检索用于确定唯一性的属性,但不确定如何实现。当用于比较的属性位于pojo的顶层时,我知道如何做,但当属性嵌套在另一个对象中时,我不知道如何做。