본문 바로가기
Android/Unit Test

[Android] Unit Test 작성하기 -2

by startSW 2023. 9. 22.

https://swjsw.tistory.com/21

 

[Android] Unit Test 작성하기 -1

아래 글은 이전에 작성한 ViewModel 클래스를 참고로 작성되었습니다. https://swjsw.tistory.com/20 [Android] Livedata 사용하기 아래 글은 이전에 작성한 ViewModel 클래스를 참고하여 작성 되었습니다. https://swj

swjsw.tistory.com

 

앞에서 작성했던 Unit Test 클래스에 LiveData를 observation 하기 위한 테스트를 추가해 보겠습니다.

 

먼저 “Extentions.kt” 라는 파일을 “/app/src/test/java/com/swjsw/app/” 폴더밑에 생성하고, LiveData 클래스의 확장함수를 아래와 같이 추가합니다.

import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException

/* Copyright 2019 Google LLC.
   SPDX-License-Identifier: Apache-2.0 */
fun <T> LiveData<T>.getOrAwaitValue(
    time: Long = 2,
    timeUnit: TimeUnit = TimeUnit.SECONDS
): T {
    var data: T? = null
    val latch = CountDownLatch(1)
    val observer = object : Observer<T> {
        override fun onChanged(value: T) {
            data = value
            latch.countDown()
            this@getOrAwaitValue.removeObserver(this)
        }
    }

    this.observeForever(observer)

    // Don't wait indefinitely if the LiveData is not set.
    if (!latch.await(time, timeUnit)) {
        throw TimeoutException("LiveData value was never set.")
    }

    @Suppress("UNCHECKED_CAST")
    return data as T
}

 

 

그 다음 아래의 코드를 기존 Test Class 에 추가하고 테스트 합니다.

@Test
    fun testLiveDataObserver() {
        viewModel.turnOnFlashlight()

        println("testLiveDataObserver")
        Assert.assertEquals(true, viewModel.isFlashlightOn.getOrAwaitValue())

        viewModel.turnOffFlashlight()
        Assert.assertEquals(false, viewModel.isFlashlightOn.getOrAwaitValue())
    }

 

테스트가 패스된 것을 확인 할 수 있습니다.