본문 바로가기
Java & Kotlin/Kotlin

[MockK] mock 객체가 호출되지 않았음을 검증하기

by devson 2022. 10. 21.

기능 개발을 하다보면 상태 값에 따라 특정 기능을 실행할지 말지 분기를 탈 필요가 있다.

 

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: Called) infix function을 사용할 수 있다.

 

import io.kotest.core.spec.style.DescribeSpec
import io.mockk.called
import io.mockk.clearMocks
import io.mockk.mockk
import io.mockk.verify

class SomeServiceTest : DescribeSpec({
    val someFeatureMock = mockk<SomeFeature>(relaxed = true)
    val sut = SomeService(someFeature = someFeatureMock)

    beforeTest {
        clearMocks(someFeatureMock)
    }

    context("executeIfFlagIsOn method는") {
        context("flag가 true인 경우") {
            it("기능을 실행한다") {
                // when
                sut.executeIfFlagIsOn(flag = true)

                // then
                verify {
                    someFeatureMock.execute() // execute 메서드가 실행됨
                }
            }
        }

        context("falg가 false인 경우") {
            it("기능을 실행하지 않는다") {
                // when
                sut.executeIfFlagIsOn(flag = false)

                // then
                verify {
                    someFeatureMock wasNot called // mock 객체가 사용되지 않음
                }
            }
        }
    }
})

 

테스트 결과

댓글