Skip to content

Commit d16a163

Browse files
committed
kotlin ftw
1 parent f50b43e commit d16a163

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

spring-ai-core/src/main/kotlin/org/springframework/ai/chat/client/ChatClientExtensions.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@
1616

1717
package org.springframework.ai.chat.client
1818

19+
import org.springframework.ai.chat.model.ChatResponse
20+
import org.springframework.core.ParameterizedTypeReference
21+
1922
/**
20-
* Extension for [ChatClient] providing a `entity<Foo>()` variant.
23+
* Extensions for [ChatClient] providing a reified generic adapters for `entity` and `responseEntity`
2124
*
2225
* @author Josh Long
2326
*/
2427

25-
inline fun <reified T> ChatClient.CallResponseSpec.entity(): T = entity(T::class.java) as T
28+
inline fun <reified T> ChatClient.CallResponseSpec.entity(): T =
29+
entity(object : ParameterizedTypeReference<T>() {}) as T
30+
31+
inline fun <reified T> ChatClient.CallResponseSpec.responseEntity(): ResponseEntity<ChatResponse, T> =
32+
responseEntity(object : ParameterizedTypeReference<T>() {})

spring-ai-core/src/test/kotlin/org/springframework/ai/chat/client/ChatClientExtensionsTests.kt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,28 @@ import io.mockk.every
2020
import io.mockk.mockk
2121
import io.mockk.verify
2222
import org.junit.jupiter.api.Test
23+
import org.springframework.ai.chat.model.ChatResponse
24+
import org.springframework.core.ParameterizedTypeReference
2325

2426
class ChatClientExtensionsTests {
2527

26-
private val crs = mockk<ChatClient.CallResponseSpec>()
27-
2828
data class Joke(val setup: String, val punchline: String)
2929

3030
@Test
31-
fun withEntityType() {
32-
val joke = Joke(
33-
setup = "Why did the scarecrow win an award?",
34-
punchline = "Because he was outstanding in his field!"
35-
)
36-
every { crs.entity(any<Class<*>>()) } returns joke
31+
fun responseEntity() {
32+
val crs = mockk<ChatClient.CallResponseSpec>()
33+
val re = mockk<ResponseEntity<ChatResponse, Joke>>()
34+
every { crs.responseEntity<Joke>() } returns re
35+
crs.responseEntity<Joke>()
36+
verify { crs.responseEntity(object : ParameterizedTypeReference<Joke>() {}) }
37+
}
38+
39+
@Test
40+
fun entity() {
41+
val crs = mockk<ChatClient.CallResponseSpec>()
42+
val joke = mockk<Joke>()
43+
every { crs.entity(any<ParameterizedTypeReference<Joke>>()) } returns joke
3744
crs.entity<Joke>()
38-
verify { crs.entity(Joke::class.java) }
45+
verify { crs.entity(object : ParameterizedTypeReference<Joke>(){}) }
3946
}
4047
}

0 commit comments

Comments
 (0)