앞에서 작성했던 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())
}
테스트가 패스된 것을 확인 할 수 있습니다.
'Android > Unit Test' 카테고리의 다른 글
[Android] Unit Test 작성하기 -5(Mockito-2) (0) | 2023.09.27 |
---|---|
[Android] Unit Test 작성하기 -4(Mockito-1) (0) | 2023.09.27 |
[Android] 구글 Coroutine Test 정리 글 (0) | 2023.09.22 |
[Android] Unit Test 작성하기 -3 (0) | 2023.09.22 |
[Android] Unit Test 작성하기 -1 (0) | 2023.09.22 |