테스트할 때 필요한 객체를 일일이 만들기 귀찮을 때
728x90
반응형

.

시작하기 앞서

여기에서 진행되는 환경은 스프링부트 + 코틀린이며 아래와 같은 의존성이 추가가 되어 있다.

kotlinVersion=1.7.10
springBootVersion=2.5.13

// build.gradle
testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.kafka:spring-kafka-test")
testImplementation("io.mockk:mockk:1.13.1")

 

테스트를 만들었는데

when-then 형태로 아래와 같은 테스트를 만들었다고 가정하자.

lateinit var createModel: CreateModel

@BeforeEach
internal fun setUp() {
    createModel = CreateModel(
        email = "abc@test.com",
        phoneNo = "010-1111-2222",
        type = "TEST",
        companyName = "Smaple Co",
        category = "서비스",
        address = "가가시 나나구 다다동 라라길 12-34",
        detailAddress = "101호",
        zipCode = "01234",
        memo = "memo sample",
        telNo = "02-0000-0000",
        homepage = "http://sample.com"
    )
}

@Test
fun `최초 등록 성공`() {
    // given
    whenever(sampleRepository.save(any<Sample>())).then {
        println(">>> partnerRepository.save")
        val sample = Sample.toEntity(createModel) // <--- 여기
        sample.id = 9999
        return@then sample
    }
}

sample이라는 Entity를 만들기위해 모델을 미리 정의했는데 여기에 필드를 하나씩 입력했다. 만약 필드가 수십개가 된다면 이걸 일일이 입력하는게 여간 귀찮은 일이 아니다. Mock으로 하는 방법이 없을까 찾아보았는데 역시 선배 개발자들이 기가막힌걸 준비해놓은게 있었다. (무릎을 탁~)

 

 

Mockk 적용

가장 먼저 언급한 의존성 가이드에 보면 'mockk'이라는 것이 등장한다. 코틀린용 Mock 프레임워크라고 보면 된다. 여기서 제공해주는 방식으로 아래처럼 사용해보자. (mockk maven link)

@BeforeEach
internal fun setUp() {
    createModel = mockk(relaxed = true) {
        every { type } returns "TEST"
    }
}

createModel을 Mock으로 만들어 주었다. relaxed를 true로 세팅하면 모델 내부값을 기본값으로 만들어준다. 또한 기본값 외에 별도값을 입력하고 싶다면 every를 사용하여 값을 넣어주면 된다.

 

행복하다. 행복해. 알면 알수록 귀찮은게 팍팍 줄어듭니다. 유후~

 

참고자료
- MOCKING IN KOTLIN WITH MOCKK
- [Android] Kotlin으로 안드로이드 개발 시 테스트 하는 법 - MockK
- Kotlin에서 mock 테스트 하기

 

.

728x90
반응형