유닛 테스트를 신나게 적용하다 보면, 검증해야 하는 변수나 결과가 LiveData와 맞물려 들어가는 로직과 맞닥뜨릴 수 있다.
여기서 특정 결과값이 특정 LiveData를 Observing하는 방식으로 도출된다면, Mocking하는 것도 쉽지 않을 것이다.
이런 케이스를 해결하기 위해 실 Stub LiveData를 만들어 초기값을 넣어줌으로써,
본래 수행하려던 테스트 케이스를 성공적으로 돌릴 수 있었다!
사용 예를 남기고자 Pizza라는 data class를 담는 LiveData를 예시로 테스트 코드를 작성해보겠다.
테스트 환경은 아래와 같다.
- Mockito
- LiveDataTesting https://github.com/jraska/livedata-testing
- Koin DI
- Coroutine
- Clean Architecure
data class Pizza(
val pizzaName: String,
val price: Int
)
@Mock
lateinit mockedPizza: Pizza
@Test
fun `something_to_test`() {
// Mock Pizza 객체를 설정한다
`when`(mockedPizza).thenReturn(
Pizza("Deluxe", 15000)
)
// stubLiveData의 초기 값을 mocking한 Pizza 객체로 설정한다
// (data class 이기 때문에 반드시 mocking한 Pizza 객체보단 실 객체를 넣어도 무방할 것으로 보인다)
val stubLiveData = MutableLiveData<Pizza>().apply {
value = mockedPizza
}
// pizzaService에서 choosenPizza(LiveData<Pizza>) 를 참조하는 경우
// 위에서 설정한 stubLiveData를 return하도록 한다.
val pizzaService = declarMock<PizzaService> {
given(this.choosenPizza).willReturn(stubLiveData)
}
val viewModel = PizzaViewModel(pizzaService)
// 테스트 검증
viewModel.choosenPizza.test().pizzaName.assertValue("Deluxe")
)
'ANDROID > Testing' 카테고리의 다른 글
[Android/Testing] Hot StateFlow의 유닛 테스팅 in ViewModel (0) | 2023.08.29 |
---|---|
[Testing/Unit-test] Context를 포함하는 ViewModel의 Unit Test (0) | 2022.01.14 |
[안드로이드] 람다 Function을 파라미터로 가지는 로직의 Unit Testing! (0) | 2021.01.11 |
[안드로이드/Firebase] adb를 Android studio 터미널에 설정하기, adb 이용해 Firebase event 디버깅하기 (0) | 2020.12.14 |
[Jacoco] Jacoco와 gradle로 프로젝트 코드 커버리지 확인하기(Gradle 3.6 버전 이상의 경우) (0) | 2020.03.23 |