본문 바로가기

ANDROID/Testing

[Kotlin/UnitTesting] LiveData Mocking하기

유닛 테스트를 신나게 적용하다 보면, 검증해야 하는 변수나 결과가 LiveData와 맞물려 들어가는 로직과 맞닥뜨릴 수 있다.

 

여기서 특정 결과값이 특정 LiveData를 Observing하는 방식으로 도출된다면, Mocking하는 것도 쉽지 않을 것이다.

 

 

이런 케이스를 해결하기 위해 실 Stub LiveData를 만들어 초기값을 넣어줌으로써,

본래 수행하려던 테스트 케이스를 성공적으로 돌릴 수 있었다!

 

사용 예를 남기고자 Pizza라는 data class를 담는 LiveData를 예시로 테스트 코드를 작성해보겠다.

 

테스트 환경은 아래와 같다.

 

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")
)