0

我正在尝试测试一个RoomDAO 公开返回的函数Flows。以下测试不会通过,我正在努力寻找原因:

    @Test
    fun `observeHomeCoursesFeatured() does not return courses that are no longer featured`() = runBlocking {
        val outputList: MutableList<List<HomeCourse>> = mutableListOf()
        launch { subject.observeHomeCoursesFeatured().collect { outputList.add(it) } }

        subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()))
        subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1()))

        assertEquals(2, outputList.size)
        assertEquals(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()), outputList[0])
        assertEquals(listOf(getHomeCourseFeatured1()), outputList[1])
    }

它没有assertEquals(2, outputList.size)说那outputList是空的。

该测试通过:

    @Test
    fun `observeHomeCoursesFeatured() does not return courses that are no longer featured`() = runBlocking {
        subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()))
        assertEquals(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()), subject.observeHomeCoursesFeatured().first())

        subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1()))
        assertEquals(listOf(getHomeCourseFeatured1()), subject.observeHomeCoursesFeatured().first())
    }

第二次测试通过,表明我的 DAO 工作正常,更多的是测试线程和Room用于触发Flow更改的线程之间的线程和并发问题。

我已经@get:Rule val archRule = InstantTaskExecutorRule()在我的测试中添加了。我还用这个构建我的测试数据库:

db = Room.inMemoryDatabaseBuilder(ctx, CoreDatabase::class.java)
            .setTransactionExecutor(Executors.newSingleThreadExecutor())
            .allowMainThreadQueries()
            .build()

我错过了什么?

4

1 回答 1

1

launch是异步的,所以你有一个竞争条件。

@Test
fun `observeHomeCoursesFeatured() does not return courses that are no longer featured`() = runBlocking {
    val job = async { subject.observeHomeCoursesFeatured().take(2).toList() }

    subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()))
    subject.saveHomeCoursesFeatured(listOf(getHomeCourseFeatured1()))

    val outputList = job.await()

    assertEquals(2, outputList.size)
    assertEquals(listOf(getHomeCourseFeatured1(), getHomeCourseFeatured2()), outputList[0])
    assertEquals(listOf(getHomeCourseFeatured1()), outputList[1])
}
于 2020-06-28T11:03:46.923 回答