2018年6月20日水曜日

LiveData を UnitTest でテストする

デザートの文字列を保持して、追加・削除されたタイミングで保持数を LiveData で通知する DessertsHolder を UnitTest でテストしてみましょう。 class DessertsHolder { private val counter = MutableLiveData<Int>() private val list = mutableListOf<String>() init { counter.value = 0 } fun getCounter(): LiveData<Int> = counter fun add(item: String) { list.add(item) counter.value = list.size } fun remove(item: String) { list.remove(item) counter.value = list.size } fun clear() { list.clear() counter.value = 0 } } 特に何もせず次のような普通の UnitTest を書くと、Looper が mock されていないというエラー(RuntimeException: Method getMainLooper in android.os.Looper not mocked. )がでます。 class DessertsHolderTest { @Test fun test() { val holder = DessertsHolder() holder.add("Donuts") assertThat(holder.getCounter().value).isEqualTo(1) } }

そこで、まず AAC の core-testing ライブラリを追加します。 dependencies { def lifecycle_version = "1.1.1" testImplementation "android.arch.core:core-testing:$lifecycle_version" } AndroidX dependencies { def lifecycle_version = "2.0.0" testImplementation "androidx.arch.core:core-testing:$lifecycle_version" }
そして @get:Rule で rule に InstantTaskExecutorRule を指定します。このとき get: をつけないと rule が public ではないという ValidationError (ValidationError: The @Rule 'rule' must be public.)が起こるので注意しましょう。 class DessertsHolderTest { @get:Rule val rule: TestRule = InstantTaskExecutorRule() @Test fun test() { ... } }


0 件のコメント:

コメントを投稿