본문 바로가기
Android

[Android] 단위 테스트 코드 작성

by 박매트 2024. 5. 24.

SettleUpCompleteViewModel  기준으로 작성

 

안드로이드에서는 주로 JUnit을 사용하여 단위 테스트(Unit Test)를 작성합니다. 또한, LiveData와 같은 안드로이드 아키텍처 컴포넌트를 테스트하기 위해서는 androidx.arch.core:core-testing 라이브러리를 사용할 수 있습니다.

 

1. 의존성 추가하기

먼저, 테스트를 위한 의존성을 build.gradle 파일에 추가해야 합니다. 

// 단위 테스트를 위한 JUnit
testImplementation 'junit:junit:4.13.2'

// AndroidX Test - LiveData와 같은 컴포넌트를 위한
testImplementation 'androidx.arch.core:core-testing:2.1.0'

// Coroutines 테스트를 위한
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'

// Hilt를 사용하는 경우 Hilt 테스트 의존성
androidTestImplementation 'com.google.dagger:hilt-android-testing:2.31.2-alpha'
kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'

// Mocking을 위한 Mockito
testImplementation 'org.mockito:mockito-core:3.3.3'

 

2. 테스트 클래스 생성하기

SettleUpCompleteViewModel 클래스를 테스트하기 위한 테스트 클래스를 생성하세요. 가장 기본적인 형태로는 다음과 같습니다.

 

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations

@ExperimentalCoroutinesApi
class SettleUpCompleteViewModelTest {

    @get:Rule
    var instantExecutorRule = InstantTaskExecutorRule()

    @Mock
    private lateinit var prefs: SharedPreferenceUtil

    @Mock
    private lateinit var settlementAddUseCase: SettlementAddUseCase

    @Mock
    private lateinit var booksSettingGetUseCase: BooksSettingGetUseCase

    @Mock
    private lateinit var alarmSaveGetUseCase: AlarmSaveGetUseCase

    private lateinit var viewModel: SettleUpCompleteViewModel

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        viewModel = SettleUpCompleteViewModel(
            stateHandle = SavedStateHandle(),
            prefs = prefs,
            settlementAddUseCase = settlementAddUseCase,
            booksSettingGetUseCase = booksSettingGetUseCase,
            alarmSaveGetUseCase = alarmSaveGetUseCase
        )
    }

    @Test
    fun testGetOutcomesItems() = runBlockingTest {
        // 여기에서 getOutcomesItems()의 결과를 테스트하는 로직을 작성합니다.
    }
}

 

3. 테스트 케이스 작성하기

실제로 테스트를 진행하려면, Mockito 라이브러리를 사용하여 필요한 메서드의 동작을 모의(Mock)하고, 테스트 대상 메서드를 실행한 뒤 결과를 검증해야 합니다. 예를 들어, getOutcomesItems() 메서드를 테스트한다면 Mockito를 사용하여 settlementAddUseCase의 동작을 모의할 수 있습니다.

주의 사항

  • LiveData를 테스트 하기 위해서는 InstantTaskExecutorRule을 사용하세요. 이는 LiveData 이벤트가 메인 스레드에서 동기적으로 실행되도록 도와줍니다.
  • 코루틴을 사용하는 경우 @ExperimentalCoroutinesApi 어노테이션과 함께 runBlockingTest 블록을 사용하여 테스트를 작성하세요.
  • Hilt, Room, Retrofit 등의 라이브러리를 사용하는 경우 해당 라이브러리들의 테스트를 위한 추가 설정이 필요할 수 있습니다.

테스트 코드 작성은 앱의 안정성을 보장하고, 리팩토링이나 기능 추가 시 기존 기능이 올바르게 동작하는지 검증하는 데 매우 중요합니다. 위의 가이드를 참고하여 SettleUpCompleteViewModel 클래스의 다른 메서드들에 대해서도 테스트를 작성해보세요.

 

- 뤼튼 답 응용