안드로이드 ViewModel 테스트

BongKu·2023년 12월 27일
0

Android

목록 보기
25/30

ViewModel 테스트코드 작성

build.gradle 의존성 추가

	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 : 두 값을 비교하는 함수입니다.

테스트 결과

profile
화이팅

0개의 댓글