Skip to content

Commit f52e95e

Browse files
Dariusz Kucdinomite
authored andcommitted
sealed class test using deduction instead of field
Add a test that verifies we can deserialize sealed classes using `JsonTypeInfo.Id.DEDUCTION` instead of explicit field names.
1 parent e8ede0a commit f52e95e

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/SealedClassTest.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.fasterxml.jackson.module.kotlin.test
22

3+
import com.fasterxml.jackson.annotation.JsonCreator
4+
import com.fasterxml.jackson.annotation.JsonSubTypes
35
import com.fasterxml.jackson.annotation.JsonTypeInfo
6+
import com.fasterxml.jackson.annotation.JsonValue
47
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
58
import com.fasterxml.jackson.module.kotlin.test.SealedClassTest.SuperClass.B
69
import org.junit.Test
10+
import kotlin.test.assertEquals
711
import kotlin.test.assertTrue
812

913
class SealedClassTest {
@@ -23,9 +27,33 @@ class SealedClassTest {
2327
assertTrue { result is B }
2428
}
2529

30+
/**
31+
* Tests that we can use JsonTypeInfo.Id.DEDUCTION to deduct sealed types without the need for explicit fields.
32+
*/
33+
@Test
34+
fun sealedClassWithoutTypeDiscriminator() {
35+
val serializedSingle = """{"request":"single"}"""
36+
val single = mapper.readValue(serializedSingle, SealedRequest::class.java)
37+
assertTrue(single is SealedRequest.SingleRequest)
38+
assertEquals("single", single.request)
39+
40+
val serializedBatch = """[{"request":"first"},{"request":"second"}]"""
41+
val batch = mapper.readValue(serializedBatch, SealedRequest::class.java)
42+
assertTrue(batch is SealedRequest.BatchRequest)
43+
assertEquals(2, batch.requests.size)
44+
assertEquals("first", batch.requests[0].request)
45+
assertEquals("second", batch.requests[1].request)
46+
}
47+
2648
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
2749
sealed class SuperClass {
2850
class A : SuperClass()
2951
class B : SuperClass()
3052
}
53+
54+
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
55+
sealed class SealedRequest {
56+
data class SingleRequest(val request: String) : SealedRequest()
57+
data class BatchRequest @JsonCreator constructor(@get:JsonValue val requests: List<SingleRequest>): SealedRequest()
58+
}
3159
}

0 commit comments

Comments
 (0)