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는 일반 함수에만 사용할 수 있어 오류가 생긴다.
이를 해결하기 위해, 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)
}
}
그러면 오류가 모두 사라지는 것을 확인할 수 있다.
테스트를 실행하면 coEvery가 예상된 대로 동작해 테스트가 통과되는 것을 볼 수 있다.
반응형