Image
Testing Codes/MockK

[MockK] every 사용해 목 객체 입력에 대한 응답값 설정하기

이전 글 요약

이전 글에서는 mockk 함수를 사용해 Mock 객체를 만드는 방법에 대해 알아보았고,  

val userRepository : UserRepository = mockk()
val contactRepository : ContactRepository = mockk()
val userProfileFetcher = UserProfileFetcher(
    userRepository = userRepository,
    contactRepository = contactRepository
)

every를 사용해 목 객체의 함수가 호출될 때 반환 값을 반환하는 방법에 대해 알아보았다.

every { contactRepository.getPhoneNumberByUserId(any()) }.returns("010-xxxx-xxxx")

이번 글에서는 every를 사용해 목 객체의 입력에 대한 응답값을 설정하는 다양한 방법에 대해 알아볼 것이다.

 

사용할 객체

이번 글에서는 조금 더 간단한 객체를 사용해 테스트를 진행한다. UserProfile은 id와 name으로 이루어지며, UserProfileFetcher의 getUserProfileById가 호출되면 UserRepository의 getNameByUserId가 호출되어 유저의 이름을 반환받는다.

class UserProfileFetcher(
    private val userRepository: UserRepository,
) {
    fun getUserProfileById(id: String): UserProfile {
        return UserProfile(
            id = id,
            name = userRepository.getNameByUserId(id)
        )
    }
}

interface UserRepository {
    fun saveUserName(id: String, userName: String)
    fun getNameByUserId(id: String): String
}

data class UserProfile(val id: String, val name: String)

 

입력값 설정하기

모든 입력에 대한 반환값 설정하기

모든 입력에 대한 반환값ㅇ르 설정하기 위해서는 호출하는 함수의 인자로 any()를 넣으면 된다. 예를 들어 UserRepository의 getNameByUserId의 인자로 어떤 아이디가 들어가든 특정한 'TestUser'이라는 이름이 반환되어야 한다면, 다음과 같이 작성될 수 있다.

class UserProfileFetcherTest {
    @Test
    fun test() {
        // Given
        val userRepository : UserRepository = mockk()
        val userProfileFetcher = UserProfileFetcher(
            userRepository = userRepository
        )
        every { userRepository.getNameByUserId(any()) }.returns("TestUser")
        ...
    }
}

 

특정 입력에 대한 반환값 설정하기

만약 특정한 입력이 들어왔을 때만 반환값을 주고 싶다면, any() 대신 구체적인 값을 넣으면 된다.

every { userRepository.getNameByUserId("0xffffffff") } returns "TestUser"

 

반환값 설정하기

returns 사용해 반환값 설정하기

returns를 사용해 반환값을 설정하면, 특정 값을 반환 값으로 넣을 수 있다. 예를 들어 앞서 본 것 처럼, UserRepository의 getNameByUserId가 호출되었을 때 0xffffffff란 id가 입력으로 들어왔을 때 TestUser 문자열이 반환되어야 한다면 다음과 같이 returns의 값으로 "TestUser"을 넣으면 된다.

every { userRepository.getNameByUserId("0xffffffff") }.returns("TestUser")

 

returns는 infix 함수이다.

returns는 infix 함수이기 때문에 다음과 같이 작성될 수도 있다. 자신이 선호하는 방식으로 작성하도록 하자.

every { userRepository.getNameByUserId("0xffffffff") } returns "TestUser"

 

 

answers 사용해 반환값 설정하기

반환값을 설정하기 위해 특정 값을 바로 반환하는 것이 아닌, 식을 통해 값을 반환하고 싶다면 answers를 사용하면 된다.

every { userRepository.getNameByUserId("0xffffffff") } answers {
    val prefix = "[Admin]"
    val userName = "DevCho"
    "$${prefix}${userName}"
}

 

throws 사용해 예외 발생시키기

만약 특정 입력이 들어왔을 때 예외를 발생시키고 싶다면 throws를 사용하면 된다.  

every { userRepository.getNameByUserId("zzz") } throws IllegalArgumentException("Wrong Id")

 

 

정리

이번 글에서는 MockK를 사용해 목 객체를 만들었을 때, 목 객체의 입력에 대한 반환값을 설정하는 다양한 방법을 알아보았다. 다음 글에서는 every를 사용하면서 입력으로 특정 범위의 값이 들어왔을 때에 대한 응답값을 설정하는 방법에 대해 알아볼 것이다.

 

반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com