ViewModel 테스트코드 작성
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
testImplementation 'io.mockk:mockk:1.13.5'
testImplementation 'app.cash.turbine:turbine:1.0.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
현재 진행중인 프로젝트의 예시 코드
class RecentMatchesViewModelTest {
private lateinit var matchRepository: MatchRepository
private lateinit var recentMatchesViewModel: RecentMatchesViewModel
@OptIn(ExperimentalCoroutinesApi::class)
@Before
fun setUp() {
Dispatchers.setMain(Dispatchers.Unconfined)
matchRepository = mockk()
recentMatchesViewModel = RecentMatchesViewModel(matchRepository)
}
fun `최근전적 기록을 요청하면`(nickname: String) {
recentMatchesViewModel.fetchMatches(nickname)
}
@Test
fun `경기정보 가져오기 성공 시 UiState를 Success로 업데이트한다`() {
// given
val nickname = "사용자 이름"
val emptyList: List<Match> = listOf()
coEvery {
matchRepository.fetchMatches(nickname)
} returns Result.success(emptyList())
// when
`최근전적 기록을 요청하면`(nickname)
val actual = recentMatchesViewModel.uiState.value
// then
val expected = RecentMatchesUiState.Success(emptyList)
assertEquals(expected, actual)
}
@Test
fun `매치정보 가져오기 실패 시 uiState를 Error로 업데이트한다`() {
// given
val nickname = "사용자 이름"
val errorMessage = "Failed"
coEvery {
matchRepository.fetchMatches(nickname)
} returns Result.failure(Throwable(errorMessage))
// when
`최근전적 기록을 요청하면`(nickname)
val actual = recentMatchesViewModel.uiState.value
// then
val expected = RecentMatchesUiState.Error
assertEquals(expected, actual)
}
}
@Before
: 테스트코드를 실행하기 전 작업할 사항들을 정의합니다.
Dispatchers.setMain(Dispatchers.Unconfined)
단위 테스트를 백그라운드 스레드에서 작업하면 복잡하고 비효율적일 수 있기 때문에, 테스트 시 작업을 메인 스레드로 이동하여 동기적으로 수행하도록 합니다.
mockk()
: 가상으로 구현한 mock 객체를 생성합니다. 실제 데이터베이스나 네트워크를 호출하지 않고 가상의 작업을 수행할 수 있습니다.
@Test
: 테스트할 작업을 정의합니다.
coEvery
: 코루틴 함수 작업을 정하고 코루틴 함수가 어떤 값을 반환할지 지정할 수 있습니다.
assertEquals
: 두 값을 비교하는 함수입니다.