Kotlin

    [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: Strin..

    [MockK] relaxed 사용해 복잡한 객체에 대한 Dummy 출력 설정하기

    Dummy란 무엇인가? Test Doubles에서 Dummy란 어떤 함수를 호출하든 응답값으로 빈 값을 주는 객체를 뜻한다. 이러한 Dummy는 반환값이 필요없는 객체의 반환값을 설정하기 위해 사용한다. 하지만, 순수한 의미의 Dummy는 응답값이 설정되는 순간부터는 Stub이 되기 때문에 사용처가 한정된다. 테스트를 위한 환경 설정 이 글에서는 ManyGetRepository를 주입 받는 ManyGetUseCase를 테스트 한다. class ManyGetUseCase( private val manyGetRepository: ManyGetRepository ) { fun callGet(int: Int): Int = when (int) { 0 -> manyGetRepository.getA() 1 -> ma..

    [MockK] verify 사용해 목 객체의 상호 작용 테스트하기

    테스트에서 사용할 객체 테스트에서 사용할 객체는 다음과 같다. 이 객체들에 대해서는 이전 글에서 이미 설명했고 복잡하지 않은 객체이므로, 추가로 설명하지 않는다. 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):..

    [MockK] every를 match와 같이 사용해 입력값을 범위로 지정하기

    입력값을 특정 값으로 지정하는 것의 한계 입력값을 다음과 같이 지정하게 되면, getNameByUserId에 0xffffffff이 입력되었을 때만 "TestUser"이 반환된다. every { userRepository.getNameByUserId("0xffffffff") } returns "TestUser" 그렇다면 만약 유효한 아이디 일 경우에 "TestUser"을 반환하고, 유효하지 않은 아이디일 경우에는 예외를 반환하는 목 객체는 어떻게 만들 수 있을까? 만약 유효한 아이디가 8자리의 16진수값이라면, 이에 대한 모든 값에 대해 every를 작성하게 되면 수십억줄의 코드를 작성해야 할 수 있다. 이런 경우 만약 입력 값을 특정 범위로 지정할 수 있다면 매우 도움이 될 것이다. 이를 위해 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-xx..