본문 바로가기

Java & Kotlin/Kotlin10

reified를 통해 generic type 정보 가져오기 generic을 사용하여 코드를 작성할 때, generic type의 정보를 사용하고 싶은 경우가 있을 것이다. 아래 코드는 generic을 사용하여 파라미터의 타입을 확인하는 함수이다. fun isInstanceOf(obj: Any): Boolean { println("check object(${obj::class}) is instance of ${T::class}") return obj is T } 하지만 generic은 compile 후 제거되기 때문에 위 코드와 같이 generic type을 직접적으로 사용하는 코드는 compile error를 낸다. 그래서 주로 아래와 같이 추가로 generic type과 같은 Class 타입의 파라미터를 받는 식으로 우회한다. fun isInstanceOf(o.. 2023. 1. 16.
[MockK] mock 객체가 호출되지 않았음을 검증하기 기능 개발을 하다보면 상태 값에 따라 특정 기능을 실행할지 말지 분기를 탈 필요가 있다. class SomeService( private val someFeature: SomeFeature, ) { fun executeIfFlagIsOn(flag: Boolean) { if (flag) { this.someFeature.execute() } } } class SomeFeature { fun execute() {} } 위와 같이 SomeService#executeIfFlagIsOn 메서드는 flag 파라미터를 통해 SomeFeature기능을 실행할지 말지를 결정하는 코드가 있을 때, MockK를 사용하여 SomeFeature의 기능이 실행되거나 안되었음을 테스트하기 위해서 wasNot(called: Call.. 2022. 10. 21.
JPA entity의 VO로 Kotlin value class 사용하기 DDD와 같이 도메인에 집중하는 설계 방식에 관련된 책이나 블로그 글들을 보면 VO(value object)에 대해 이야기하는 것을 자주 볼 수 있을 것이다. VO는 도메인에서 다루는 값을 나타내는 객체로 String이나 Int 등 범용적인 타입이 아닌 그 자체로 도메인의 값을 나타내며, 객체 안에 있는 값 또한 해당 도메인에서 사용하는 신뢰할 수 있는 값을 가지고 있다는 특징을 지닌다. (예를 들어 Email이라는 VO는 {username}@{domain} 형태의 String 값임을 나타낸다) 이번 포스팅에서는 Kotlin을 사용할 때 JPA entity와 VO 사용에 대해서 특히 value class를 사용한 VO에 대해 알아보도록 하겠다. (관련 코드는 여기에서 확인할 수 있다) Kotlin과 J.. 2022. 6. 1.
[MockK] 메서드 호출 순서 검증하기 객체의 메서드를 여러 번 호출하는 로직이 있을 때, 사용되는 메서드를 순서대로 확인하고 싶을 때가 있을 수 있다. (하지만 구현 사항을 너무 깊게 확인하는 것일 수 있으니 정말 필요한 검증인지 충분히 고민해봐야한다) MockK를 사용할 때는 verifySequence를 사용하면 mock object의 호출 순서를 확인할 수 있다. import io.kotest.core.spec.style.DescribeSpec import io.mockk.mockk import io.mockk.verifySequence class MyObject { fun fun1(value: Any) { println(value) } fun fun2(value: Any) { println(value) } fun fun3(value: .. 2022. 4. 15.
[MockK] 인자 값 그대로 리턴하기 Mock 객체를 사용하다보면 JpaRepository.saveAll과 같이 입력값을 그대로 리턴해주고 싶은 경우가 생길 수 있다. 이 경우 returnsArgument를 사용하면 된다. interface TestTarget { fun function(arg1: Any, arg2: Any): Any } internal class MyRepositoryMockTest : DescribeSpec({ it(" returnsArgument 0은 첫번째 인자를 리턴한다") { // given val testTargetMock= mockk() // when every { testTargetMock.function(any(), any()) } returnsArgument 0 // then testTargetMock.f.. 2022. 4. 14.
observable, vetoable를 통한 프로퍼티 변경 감지 Kotlin은 Delegates를 통해 프로퍼티의 변경을 감지할 수 있는 매우 편리한 기능을 제공한다. observable Delegates.observable은 단순하게 프로퍼티가 변경됨을 감지하는 역할을 한다. import kotlin.properties.Delegates fun main() { var watchedNumber by Delegates.observable(0) { property, oldValue, newValue -> println("`${property.name}` changed from `$oldValue` to `$newValue`") } watchedNumber = 1 watchedNumber = 2 watchedNumber = 3 } 위 코드를 실행 시키면 콘솔에 아래와 같이.. 2021. 11. 6.