seoft

UnitTest에 LiveData사용시 에러 본문

android

UnitTest에 LiveData사용시 에러

seoft 2019. 9. 22. 00:32

[문제정의]

ViewModel내 LiveData를 set value하는 부분이있고 unit test 내에서 그 부분이 진행될 경우의 발생되는 에러

E/TestRunner: java.lang.IllegalStateException: Cannot invoke setValue on a background thread
        at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:461)
        at androidx.lifecycle.LiveData.setValue(LiveData.java:304)
        at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)

 

in logcat error

 

LiveData는 ObservableField와 달리 VM을 생성한 Activity의 생명주기를 따르게 되고

생명주기를 따르기 위해서 LiveData의 setValue가 내부적으로 mainThread를 사용하기 때문에

일반적인 mock사용시 mainThread가 아닌 환경에서 오류가 발생

    @MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);
    }

 

in androidx.lifecycle.LiveData 

 

 

 

[문제해결]

 

1. InstantTaskExecutorRule 클래스 사용을 위한 depdencies 추가

androidTestImplementation 'androidx.arch.core:core-testing:2.1.0'

 

in build.gradle

 

2. Unit Test코드 내 InstantTaskExecutorRule Rule지정

@JvmField
@Rule
val rule = InstantTaskExecutorRule()

 

in unit test class

 

 

 

[관련코드]

https://gist.github.com/seoft/d0f7f5d92cd3df285da0ceef2ab2b304t

Comments