【问题标题】:After waiting for 60000 ms, the test coroutine is not completing Android Test等待 60000 毫秒后,测试协程未完成 Android 测试
【发布时间】:2023-01-28 12:54:01
【问题描述】:

我正在尝试使用 junit4 测试房间数据库,当我开始运行测试时我正在使用流和协程我得到kotlinx.coroutines.test.UncompletedCoroutinesError: After waiting for 60000 ms, the test coroutine is not completing, there were active child jobs: [DispatchedCoroutine{Active}@773f274] 我之前尝试过使用 runBlocking 和 runBlockingTest 和 runTest 测试类->

@RunWith(AndroidJUnit4::class) // Annotate with @RunWith
class TaskDatabaseTest {
    @get:Rule
    var instatExecutorRule = InstantTaskExecutorRule()
    private lateinit var database: TaskDatabase
    private lateinit var dao: TaskDao

    private val testCoroutineDispatcher = StandardTestDispatcher()
    private val testCoroutineScope = TestScope(testCoroutineDispatcher)

 
    @Before
    fun setup() {
        Dispatchers.setMain(testCoroutineDispatcher)

        database = Room.inMemoryDatabaseBuilder(
            ApplicationProvider.getApplicationContext(),
            TaskDatabase::class.java
        ).allowMainThreadQueries().build()
        dao = database.taskDao()
    }

    @After
    fun tearDown() {
        database.close()
    }

    @Test
    fun insert() = testCoroutineScope.runTest {
        // Arrange
        val task = Task("do exercise", id = 1)
        dao.insert(task)

        val tasks = dao.getTasksSortedByName("", false).toList()
        assertThat(tasks).contains(task)

    }}

【问题讨论】:

    标签: android kotlin junit android-room kotlin-coroutines


    【解决方案1】:

    您代码中的问题是流不断发出数据,runTest 正在等待它完成。但这永远不会发生。因此,在 60000 毫秒后,runTest 将抛出错误。您可以使用turbine 库来测试流程。你可以这样做: - 1).在您的模块级别 build.gradle 文件中添加以下依赖项

    dependencies {
      testImplementation 'app.cash.turbine:turbine:0.12.1'
      androidTestImplementation 'app.cash.turbine:turbine:0.12.1'
    }
    

    2).然后,

    @Test
    fun insert() = runTest {
        val task = Task("do exercise", id = 1)
        dao.insert(task)
    
        val task2 = Task("do homework", id = 2)
        launch {
            delay(1000)
            dao.insert(task2)
        }
    
        dao.getTasksSortedByName().test {
            val tasksList = awaitItem()
            assertThat(tasksList).contains(task)
    
            val tasksList2 = awaitItem()
            assertThat (tasksList2).contains(task2)
    
            cancel()
        }
        
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2017-06-15
      • 2018-12-19
      • 2021-11-30
      • 1970-01-01
      • 2018-03-28
      相关资源
      最近更新 更多