Study Record

[안드로이드] 단위 테스트 참고사항 본문

안드로이드

[안드로이드] 단위 테스트 참고사항

초코초코초코 2023. 8. 3. 16:12
728x90

😶 gradle dependencies

testImplementation 'junit:junit:4.+'
testImplementation 'androidx.arch.core:core-testing:2.1.0'

 

 

😶 LiveData Object 테스트하기

특별한 명시가 없다면, 단위 테스트에서는 모든 것이 메인 스레드(=UI 스레드)에서 실행되는 것으로 가정한다. LiveData 는 값이 변경되는 즉시 UI를 업데이트하는데 UI는 메인 스레드(=UI 스레드)에서 업데이트되어야 한다. 하지만 LiveData 는 메인 스레드에서 엑세스할 수 없기 때문에 메인 스레드를 호출하면 안 된다고 명시해야 한다. 명시는 다음과 같다.

class ViewModelTests {
    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()
}

 

만약, TestViewModel 클래스가 다음과 같다고 하자.

class TestViewModel : ViewModel() {
    private val _quantity: MutableLiveData<Int> = MutableLiveData(0)
    val quantity: LiveData<Int>
        get() = _quantity

    private val _price: MutableLiveData<Int> = MutableLiveData(0)
    val price: LiveData<Int>
        get() = _price
    val priceString: LiveData<String> = Transformations.map(_price) {
        "${it}원"
    }

    fun setQuantity(newQuantity: Int) {
        _quantity.value = newQuantity
        updatePrice()
    }

    private fun updatePrice() {
        _price.value = (_quantity.value ?: 0) * 100
    }
}

setQuantity() 로 _quantity 값을 변경하면 updatePrice() 함수가 실행되 _price 값도 변경된다.

 

이 TestViewModel 을 테스트는 다음과 같이 할 수 있다.

class ViewModelTests {
    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @Test
    fun quantity_twelve_cupcakes(){
        val viewModel = TestViewModel()
        viewModel.setQuantity(12)

        assertEquals(12, viewModel.quantity.value)
        assertEquals(12 * 100, viewModel.price.value)
    }
}

 

Transformation.map() 함수가 포함된 LiveData 인 priceString 을 테스트하려면 LiveData 개체 값을 테스트할 때 변경 사항을 표시하기 위해 개체를 관찰해야 한다. 이것은 간단하게 observeForever 메서드를 사용하면 된다. 이부분을 포함하여 나머지 priceString 을 테스트 코드는 다음과 같다.

class ViewModelTests {
    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @Test
    fun quantity_twelve_cupcakes(){
        val viewModel = TestViewModel()
        viewModel.priceString.observeForever {}
        viewModel.setQuantity(15)

        assertEquals(15, viewModel.quantity.value)
        assertEquals(15 * 100, viewModel.price.value)
        assertEquals("${15 * 100}원", viewModel.priceString.value)
    }
}

 

728x90