ルーム付きのページング 3。ここのサンプルのようなアプリを作成し、そのテストを書き始めます。
これが私がDAOに持っているものです:
@Query("SELECT * FROM Model")
fun getModels(): PagingSource<Int, Model>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(list: MutableList<Model>) : Completable
そして、私は次のようにテストしたかった:
@OptIn(ExperimentalCoroutinesApi::class)
class DAOTest {
private lateinit var dao: Dao
private lateinit var db: ModelDatabase
private lateinit var viewModel: MyViewModel
lateinit var context: Context
private val testDispatcher = TestCoroutineDispatcher()
@Before
fun createDb() {
Dispatchers.setMain(testDispatcher)
context = InstrumentationRegistry.getInstrumentation().targetContext
db = Room.inMemoryDatabaseBuilder(context, MyDatabase::class.java)
.allowMainThreadQueries()
.build()
dao = db.Dao()
viewModel =
MyViewModel(MyRepository(db))
}
@After
fun tearDown() {
Dispatchers.resetMain()
db.close()
}
@Test
fun dataBase_insertAndGet_success() = runBlockingTest(testDispatcher) {
val differ = AsyncPagingDataDiffer(
MyAdapter.diffCallback,
noopListUpdateCallback,
testDispatcher,
testDispatcher
)
dao.insertAll(
mutableListOf(listOfModels)
).test().assertResult()
val job = launch {
viewModel.getList().collectLatest {
differ.submitData(it)
}
}
advanceUntilIdle()
Truth.assertThat(differ.snapshot()).containsExactly(
model1, model2,model3,model4)
job.cancel()
}
private val noopListUpdateCallback = object : ListUpdateCallback {
override fun onInserted(position: Int, count: Int) {}
override fun onRemoved(position: Int, count: Int) {}
override fun onMoved(fromPosition: Int, toPosition: Int) {}
override fun onChanged(position: Int, count: Int, payload: Any?) {}
}
}
サンプルのテストとまったく同じです。奇妙なことに、テストを数回実行すると、合格するものとそうでないものがあります(differ.snapshot()が空であると言います)。これは、このファイルに他のいくつかのテストがあり(更新と削除のテスト)、テスト全体を一緒に実行します。合格するテストと合格しないテストがあり、ラウンドごとに異なります。
これは、リストを取得するために ViewModel にあるものです。
fun getList(type: Int, search: String? = null): Flow<PagingData<Stock>> {
return Pager(
config = PagingConfig(
pageSize = PAGE_SIZE,
enablePlaceholders = true,
maxSize = MAX_SIZE
)
) {
repository.getListFromDao()
}.flow
.cachedIn(viewModelScope)
すべてがサンプルのようですが、なぜこの動作が起こっているのかわかりません。このような他の投稿を見ましたが、これはまさにテストで行ったものですが、それでも同じ問題があります。PagingSource<Int, Model> の型を返さずに以下のようなクエリをテストしようとすると、次のようになります。
@Query("SELECT * FROM Model")
fun getModels(): List<Model>
すべて正常に動作します。実行するたびにテストに合格します。したがって、テストのこの部分に何か問題があると思います。
val job = launch {
viewModel.getList().collectLatest {
differ.submitData(it)
}
}
私はかなり長い間取り組んでいるので、誰かが助けてヒントを与えることができれば本当にうれしいです. ありがとうございました。