본문 바로가기

Android

androidx.databinding.Observable mock

개인적으로 LiveData 보다는 Observable 시리즈 (ObservableField, ObservableInt, ObservableBoolean 등..) 를 주로 View Databinding 에 이용하고
LiveData 는 Life Cycle 에 영향 받을만한 부분만 정보 이용하고 있는데 Observable 를 테스트를 하기 위해선 어떻게 해야 하는지 알아 보았다 .

일단 이를 위해 inline fun 을 만들었는데 별건 없고 onPropertyChanged 이 호출 되었는지 ? 를 확인하기 위한 fun 이다.

inline fun androidx.databinding.Observable.mockCallback(): Observable.OnPropertyChangedCallback {
    val mockCallback = mock(androidx.databinding.Observable.OnPropertyChangedCallback::class.java)
    addOnPropertyChangedCallback(mockCallback)

    return mockCallback
}

inline fun Observable.OnPropertyChangedCallback.verifyPropertyChanged(mode: VerificationMode = atLeastOnce()) {
    verify(this, mode).onPropertyChanged(any(Observable::class.java), anyInt())
}

가령 val isRefresh: ObservableBoolean(true) 이 변수를 특정 이벤트를 통해 false 로 변경하였을‹š 이게 제대로 되었는지를 확인하는 것으로서
대략 아래와 같이 호출하면 끝

isRefresh.mockCallback().apply {
    listener.get()?.invoke() // isRefresh 에 변경을 가하는 listener 를 invoke 시키면 내부적으로 viewmodel 에서 isRefresh값을 false 로 변경하였다는 가정 하에

    verifyPropertyChanged() // 값이 변경되었음을 확인하는 코드
}

만약 값이 변경되면 `안됨` 을 체크해야 한다면 verifyPropertyChanged(never()) 형태로 호출해주면 된다.
이는 VerificationMode 를 지정하는 것으로서 VerificationMode 의 세부 내용은
Mockito.java 의 javadoc 에 설명되어 있다.