programing

Kotlin에서 Spring 매개변수화된 유형 참조 인스턴스(instance) 작성

madecode 2023. 7. 30. 22:43
반응형

Kotlin에서 Spring 매개변수화된 유형 참조 인스턴스(instance) 작성

저는 Kotlin을 배우고 스프링 부츠가 어떻게 작동하는지 테스트하려고 합니다.내 애플리케이션은 데이터를 저장하기 위해 mongo 데이터베이스를 사용하고 있으며 나는 데이터를 검색하기 위한 Jersey 리소스를 가지고 있습니다.사용하여 테스트 중입니다.spring-boot-test그리고.RestTestTemplate.

RestTestTemplate을 가지고 있습니다.exchange필요한 방법ParameterizedTypeReference이 클래스에 보호된 생성자가 있습니다.그래서 제가 코틀린으로부터 그것을 사용할 수 있었던 유일한 방법은 다음과 같습니다.

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}]")
    }
}

이 방법이 올바른(또는 유일한) 방법입니까, 아니면 더 나은 방법이 있습니까?

도움이 된다면 전체 테스트에 대한 링크가 여기 있습니다: github의 test class.

객체 표현식을 사용한 답변이 올바르고 Java에서 수행하는 방법과 직접 동등하지만, 재설계된 유형 매개 변수를 사용하면 많은 수가 필요할 때 단순화할 수 있습니다.ParameterizedTypeReferences:

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

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

컴파일러가 볼 때typeReference<SomeType>호출, 정의로 대체되었으므로 결과는 당신이 쓴 것과 같습니다.object : ParameterizedTypeReference<SomeType>() {}.

정확한 서류를 알려주신 JB Nizet님께 감사드립니다.

val responseEntity : ResponseEntity<List<Person>> =
            restTemplate.exchange(requestEntity, 
            object: ParameterizedTypeReference<List<Person>> () {})

올바르게 읽었을 경우 개체 표현식이라고 합니다.

언급URL : https://stackoverflow.com/questions/52581729/create-instance-of-spring%c2%b4s-parameterizedtypereference-in-kotlin

반응형