feat : Car Serializer 추가
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
package com.banjjoknim.playground.jsonserialize
|
||||
|
||||
data class Car(val name: String, val price: Int = 0)
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.banjjoknim.playground.jsonserialize
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator
|
||||
import com.fasterxml.jackson.databind.SerializerProvider
|
||||
import com.fasterxml.jackson.databind.ser.std.StdSerializer
|
||||
|
||||
/**
|
||||
* [jackson-object-mapper-tutorial](https://www.baeldung.com/jackson-object-mapper-tutorial) 참고.
|
||||
*
|
||||
* Custom Serializer 를 만들기 위해서는 아래와 같이 StdSerializer<T> 를 상속해야 한다.
|
||||
*
|
||||
* @see com.fasterxml.jackson.databind.ser.std.StdSerializer
|
||||
* @see com.fasterxml.jackson.databind.ser.ContextualSerializer
|
||||
*/
|
||||
class CarSerializer : StdSerializer<Car>(Car::class.java) {
|
||||
override fun serialize(value: Car, gen: JsonGenerator, provider: SerializerProvider) {
|
||||
gen.writeStartObject()
|
||||
gen.writeStringField("name", value.name)
|
||||
gen.writeNumberField("price", value.price)
|
||||
gen.writeEndObject()
|
||||
}
|
||||
}
|
||||
|
||||
class CarNameSerializer : StdSerializer<Car>(Car::class.java) {
|
||||
override fun serialize(value: Car, gen: JsonGenerator, provider: SerializerProvider) {
|
||||
gen.writeStartObject()
|
||||
gen.writeStringField("name", value.name)
|
||||
gen.writeEndObject()
|
||||
}
|
||||
}
|
||||
|
||||
class CarPriceSerializer : StdSerializer<Car>(Car::class.java) {
|
||||
override fun serialize(value: Car, gen: JsonGenerator, provider: SerializerProvider) {
|
||||
gen.writeStartObject()
|
||||
gen.writeNumberField("price", value.price)
|
||||
gen.writeEndObject()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package com.banjjoknim.playground.jsonserialize
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule
|
||||
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import org.junit.jupiter.api.Nested
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
/**
|
||||
* @see com.fasterxml.jackson.databind.ObjectMapper
|
||||
* @see com.fasterxml.jackson.databind.module.SimpleModule
|
||||
* @see com.fasterxml.jackson.databind.ser.DefaultSerializerProvider
|
||||
* @see com.fasterxml.jackson.databind.ser.BeanSerializer -> 객체를 직렬화할때 사용되는 Serializer
|
||||
* @see com.fasterxml.jackson.core.json.WriterBasedJsonGenerator
|
||||
* @see com.fasterxml.jackson.databind.ser.std.BeanSerializerBase
|
||||
* @see com.fasterxml.jackson.databind.ser.BeanPropertyWriter
|
||||
*/
|
||||
class CarSerializerTest {
|
||||
|
||||
private lateinit var mapper: ObjectMapper
|
||||
|
||||
companion object {
|
||||
private val car = Car("banjjoknim", 10_000_000)
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
mapper = ObjectMapper().registerKotlinModule()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `기본 ObjectMapper의 동작을 테스트한다`() {
|
||||
// given
|
||||
|
||||
// when
|
||||
val result = mapper.writeValueAsString(car)
|
||||
|
||||
// then
|
||||
assertThat(result).isEqualTo("""{"name":"banjjoknim","price":10000000}""")
|
||||
}
|
||||
|
||||
@DisplayName("등록된 커스텀 직렬화기의 동작을 테스트한다")
|
||||
@Nested
|
||||
inner class CarSerializerTestCases {
|
||||
@Test
|
||||
fun `모든 필드를 직렬화한다`() {
|
||||
// given
|
||||
val module = SimpleModule()
|
||||
module.addSerializer(Car::class.java, CarSerializer())
|
||||
mapper.registerModule(module)
|
||||
|
||||
// when
|
||||
val result = mapper.writeValueAsString(car)
|
||||
|
||||
// then
|
||||
assertThat(result).isEqualTo("""{"name":"banjjoknim","price":10000000}""")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `이름만 직렬화한다`() {
|
||||
// given
|
||||
val module = SimpleModule()
|
||||
module.addSerializer(Car::class.java, CarNameSerializer())
|
||||
mapper.registerModule(module)
|
||||
|
||||
// when
|
||||
val result = mapper.writeValueAsString(car)
|
||||
|
||||
// then
|
||||
assertThat(result).isEqualTo("""{"name":"banjjoknim"}""")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `가격만 직렬화한다`() {
|
||||
// given
|
||||
val module = SimpleModule()
|
||||
module.addSerializer(Car::class.java, CarPriceSerializer())
|
||||
mapper.registerModule(module)
|
||||
|
||||
// when
|
||||
val result = mapper.writeValueAsString(car)
|
||||
|
||||
// then
|
||||
assertThat(result).isEqualTo("""{"price":10000000}""")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user