Testing Codes/MockK

[MockK] coEvery 사용해 목 객체의 일시 중단 함수에 대한 테스트 응답값 설정하기

every를 사용해 응답값을 설정할 때의 문제점

이전 글에서 다루었던 UserProfileFetcher이 리모트 저장소로부터 데이터를 가져오는 I/O 작업을 한다고 가정하고, 함수를 모두 다음과 같이 일시 중단 함수로 바꿔보자.

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

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

그러면 every는 일반 함수에만 사용할 수 있어 오류가 생긴다. 

 

그림1. every와 일시중단 함수 함께 사용시 오류

이를 해결하기 위해, MockK라이브러리는 일시 중단 함수의 응답값을 설정할 수 있는 coEvery를 제공한다.

 

coEvery통해 목 객체 응답값 설정하기

coEvery를 사용하면, 일시 중단 함수에 대한 응답값을 설정할 수 있다. 앞의 코드를 다음과 같이 coEvery로 바꾸고 테스트 코드를 runBlocking으로 감싸보자. 

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

        // When
        val result = userProfileFetcher.getUserProfileById("0xffffffff")

        // Then
        assertEquals("TestUser", result.name)
    }
}

그러면 오류가 모두 사라지는 것을 확인할 수 있다.

 

그림2. 해결된 오류들

 

테스트를 실행하면 coEvery가 예상된 대로 동작해 테스트가 통과되는 것을 볼 수 있다. 

 

그림1. 테스트 통과

반응형

 

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

 

 

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

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

open.kakao.com