非同期で処理するLiveDataはテストしにくい・・・。
それでもテストしなきゃいけない!
そんなわけでやり方を調べた
・コード
class MainManager { private val _a = MutableLiveData<String>() val a: LiveData<String> = _a fun send() { _a.value = "masterka" } }
・Junit4
class MainManagerTest { @Rule @JvmField val instantTaskExecutorRule = InstantTaskExecutorRule() @Test fun livedataTest() { val manager = MainManager() val mockObserver = spyk<Observer<String>>() manager.a.observeForever(mockObserver) manager.send() verify { mockObserver.onChanged("masterka") } } }
参考
https://star-zero.medium.com/livedata%E3%81%AEunittest-2b295d2818c1
https://qiita.com/HanaleiMoon/items/375e42a9fc5e635d02c9
@Ruleはロジックを書く
https://teratail.com/questions/2340
InstantTaskExecutorRuleは以下の意味
https://star-zero.medium.com/livedata%E3%81%AEunittest-2b295d2818c1
・Junit5
@ExtendWith(value = [InstantExecutorExtension::class]) class MainManager2Test { @Test fun livedataTest() { val manager = MainManager() val mockObserver = spyk<Observer<String>>() manager.a.observeForever(mockObserver) manager.send() verify { mockObserver.onChanged("msterka") } } } class InstantExecutorExtension : BeforeEachCallback, AfterEachCallback { override fun beforeEach(context: ExtensionContext?) { ArchTaskExecutor.getInstance() .setDelegate(object : TaskExecutor() { override fun executeOnDiskIO(runnable: Runnable) = runnable.run() override fun postToMainThread(runnable: Runnable) = runnable.run() override fun isMainThread(): Boolean = true }) } override fun afterEach(context: ExtensionContext?) { ArchTaskExecutor.getInstance().setDelegate(null) } }
参考
https://jeroenmols.com/blog/2019/01/17/livedatajunit5/
・エラー
Method getMainLooper in android.os.Looper not
が出たら
testImplementation “androidx.arch.core:core-testing:2.1.0”
で修正できる
https://stackoverflow.com/questions/58057769/method-getmainlooper-in-android-os-looper-not-mocked-still-occuring-even-after-a