我正在努力学习Kotlin ,并测试它如何与弹簧靴一起工作.我的应用程序使用mongo数据库来存储数据,我有一个Jersey资源来检索数据.我正在用spring-boot-testRestTestTemplate测试它.

RestTestTemplate有一个exchange方法,需要ParameterizedTypeReference.这个类有一个受保护的构造函数.所以我从Kotlin那里用它的唯一方法是:

class ListOfPeople : ParameterizedTypeReference<List<Person>>()

以下是我的测试方法:

@Test
fun `get list of people`() {
    // create testdata
    datastore.save(Person(firstname = "test1", lastname = "lastname1"))
    datastore.save(Person(firstname = "test2", lastname = "lastname2"))
    datastore.save(Person(firstname = "test3", lastname = "lastname2"))
    datastore.save(Person(firstname = "test4", lastname = "lastname2"))

    val requestEntity = RequestEntity<Any>(HttpMethod.GET, URI.create("/person"))

    // create typereference for response de-serialization
    class ListOfPeople : ParameterizedTypeReference<List<Person>>() // can this be done inline in the exchange method?
    val responseEntity : ResponseEntity<List<Person>> = restTemplate.exchange(requestEntity, ListOfPeople())

    assertNotNull(responseEntity)
    assertEquals(200, responseEntity.statusCodeValue)
    assertTrue( responseEntity.body.size >= 4 )

    responseEntity.body.forEach { person ->
        println("Found person: [${person.firstname} ${person.lastname}] " +
                ", born [${person.birthdate}]")
    }
}

这是正确的(或唯一的)方法吗,还是有更好的方法?

If it helps, here is a link for the whole test: testclass on github

推荐答案

While the answer using object expression is correct and the direct equivalent of the way you do it in Java, reified type parameters allow you to simplify it if you need many ParameterizedTypeReferences:

inline fun <reified T> typeReference() = object : ParameterizedTypeReference<T>() {}

// called as
restTemplate.exchange(requestEntity, typeReference<List<Person>>())

When the compiler sees a typeReference<SomeType> call, it's replaced by the definition, so the result is the same as if you wrote object : ParameterizedTypeReference<SomeType>() {}.

Kotlin相关问答推荐

UByte范围. Min_UTE.. UByte.MAX_UTE不符合预期

用浮点数或十进制数给出错误答案的阶乘计算

API迁移到Spring Boot 3后,Spring Security无法工作

新的jOOQ Gradle插件无法正确处理自引用关系

Kotlin扩展函数未调用Hibernate/JPA中的重写函数

为什么可组合对象看似无状态(唯一传递的参数是函数,而不是状态),但会进行重组

为什么 Kotlin 在将协变类型参数转换为不变类型参数时会产生 Unchecked Cast 警告?

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

如何使用 Either monad 并避免嵌套 flatMap

基类中的 ViewModelProviders.get(...)

创建首选项屏幕时找不到androidx.preference.PreferenceScreen

Kotlin - 覆盖方法中的 IllegalArgumentException

如何将vararg转换为list?

未找到导入 kotlinx.coroutines.flow.*

编译错误:-Xcoroutines has no effect: coroutines are enabled anyway in 1.3 and beyond

Kotlin内联属性的用例是什么?

从 java 活动 *.java 启动 kotlin 活动 *.kt?

如何在 IntelliJ IDEA 中禁用粘贴时将 Java 转换为 Kotlin?

Android room DAO 接口不适用于继承

在 intelliJ 元素中集成 Kotlinx 协程