본문 바로가기
Android/Unit Test

[Android] Unit Test 작성하기 -4(Mockito-1)

by startSW 2023. 9. 27.

이 글에서는 Android 앱에서 Mockito를 활용하여 단위 테스트를 어떻게 수행하는지 알아보겠습니다. Mockito는 Android 앱 개발자들이 코드를 테스트하고 외부 종속성을 모의화하는 데 유용한 Java 라이브러리입니다.

Mockito란?

Mockito는 자바 애플리케이션의 단위 테스트를 위해 모의(mock) 객체를 생성하고, 객체 간의 상호 작용을 테스트하는 도구입니다. 이를 통해 특정 객체 또는 메서드의 동작을 원하는 대로 조작하고 테스트할 수 있습니다.

 

시작하기 전에

이 예제에서는 Android 프로젝트에서 Mockito를 사용하여 ViewModel을 테스트하는 방법을 보여줄 것입니다. 테스트를 위해 Android Studio 프로젝트를 설정하고 Mockito 라이브러리를 추가해야 합니다.

  1. Android 프로젝트 생성: Android Studio에서 새로운 Android 프로젝트를 생성합니다.
  2. Gradle 설정: 앱 모듈의 build.gradle 파일에 Mockito 의존성을 추가합니다.

testImplementation("org.mockito:mockito-core:4.0.0")

3. Sync 프로젝트: Android Studio에서 Gradle 프로젝트를 동기화합니다.

 

ViewModel 테스트 예제

이제 간단한 ViewModel 테스트를 작성하고 실행하는 방법을 살펴보겠습니다.

 

ViewModel 클래스

먼저 테스트할 ViewModel 클래스를 생성합니다. 아래는 ViewModel의 예제 코드입니다.


import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    fun fetchData() {
        // 네트워크 호출 또는 데이터 로드 로직을 포함할 수 있음
        _data.value = "Hello"
    }
}

 

ViewModel 테스트 작성

ViewModel을 테스트하기 위해 다음 단계를 따릅니다.

1. Mockito 모의 객체 생성


import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.junit.MockitoJUnitRunner
import org.junit.Before
import org.junit.Test

// MockitoJUnitRunner 사용
@RunWith(MockitoJUnitRunner::class)
class MyViewModelTest {

    // 모의 객체 생성
    @Mock
    private lateinit var viewModel: MyViewModel

    @Before
    fun setup() {
        // MockitoAnnotations.initMocks(this) 호출
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun testFetchData() {
        // 모의 객체의 fetchData() 메서드 호출
        viewModel.fetchData()

        // 결과 검증 (예: LiveData 값 확인)
        val result = viewModel.data.value
        assertEquals("Hello, Mockito!", result)
    }
}

 

2. 모의 객체의 동작 지정

ViewModel의 fetchData() 메서드가 네트워크 호출 또는 데이터 로드와 같은 작업을 수행할 수 있으므로 실제 네트워크 호출을 모의 객체로 대체할 수 있습니다. 이것은 실제 네트워크 호출을 피하고 테스트를 더 격리된 환경에서 수행하는 데 도움이 됩니다.

ViewModel을 사용하는 코드에서 네트워크 호출을 대체할 때, fetchData() 메서드를 호출하면 원하는 값을 반환하도록 Mockito를 설정할 수 있습니다.

import org.mockito.Mockito.`when`

//...

@Test
fun testFetchData() {
    // 모의 객체의 fetchData() 메서드 호출 시 "Hello, Mockito!" 반환하도록 설정
    `when`(viewModel.data.value).thenReturn("Hello, Mockito!")

    // 모의 객체의 fetchData() 메서드 호출
    viewModel.fetchData()

    // 결과 검증 (예: LiveData 값 확인)
    val result = viewModel.data.value
    assertEquals("Hello, Mockito!", result)
}

위의 코드에서 when(viewModel.data.value).thenReturn("Hello, Mockito!") 부분은 ViewModel의 data LiveData의 **value**가 **"Hello, Mockito!"**로 설정되도록 설정한 것입니다.

 

테스트 실행

테스트를 실행하려면 Android Studio에서 해당 테스트 파일을 선택하고 "Run" 또는 "Debug"를 클릭합니다. Mockito가 설정된 대로 fetchData() 메서드가 동작하고, LiveData 값이 예상대로 설정되었는지 확인할 것입니다.

테스트 결과를 확인하면 ViewModel의 fetchData() 메서드가 모의 객체로 대체된 것을 볼 수 있습니다. 이를 통해 네트워크 호출을 피하고도 ViewModel의 동작을 테스트할 수 있게 됩니다.

 

결론

이 글에서는 Android 앱에서 Mockito를 사용하여 ViewModel을 테스트하는 기본적인 방법을 살펴보았습니다. Mockito를 사용하면 외부 종속성을 모의화하고 코드를 격리시켜 단위 테스트를 수행하는 데 도움이 됩니다. Mockito를 활용하여 Android 앱을 더 견고하게 개발하고 테스트할 수 있습니다.