首页 > 解决方案 > 使用依赖项测试 CoroutineWorker 的初始延迟

问题描述

我知道 WorkManager 为测试工作者提供了一个工作测试工件,我们可以使用TestListenableWorkerBuilder来测试CoroutineWorker(有关更多信息,请参阅此链接)。我找到了Ian Roberts的一篇中篇文章,展示了如何通过创建自己的 WorkerFactory 来测试具有依赖关系的 CoroutineWorker。

根据官方文档,我们可以使用 TestDriver 测试 Worker 的初始延迟,但没有提及在 CoroutinesWork 上测试延迟、约束等。有没有办法使用 TestListenableWorkerBuilder 在 CoroutineWorker 中执行此类测试?

标签: testingdelaykotlin-coroutinesandroid-workmanagercoroutineworker

解决方案


在观看了 2019 Android Dev Summit 的这段视频(13:00)后,我找到了这个问题的答案:

  1. 当初始化workManager测试(通过WorkManagerTestInitHelper.initializeTestWorkManager方法)时,我们必须WorkerFactory通过配置步骤传递我们的自定义;

  2. 像通常使用该方法一样设置您的请求工作人员OneTimeWorkRequestBuilder

  3. 默认情况下,Workmanager未满足测试模式下实例的所有约束。使用 的实例TestDriver,我们可以将这些约束标记为满足。

以下是总结上述步骤的示例:

@Test
fun checkInitialDelay() {
    val config = Configuration.Builder()
        .setWorkerFactory(
            MyWorkFactory(myDependencies)
        )
        .setMinimumLoggingLevel(Log.DEBUG)
        .setExecutor(SynchronousExecutor())
        .build()
    // Initialize WorkManager
    WorkManagerTestInitHelper.initializeTestWorkManager(context, config)

    //setup the request work
    val request =
        OneTimeWorkRequestBuilder<MyWork>()
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build()

    val workManager = WorkManager.getInstance(context)
    // Get the TestDriver
    val testDriver = WorkManagerTestInitHelper.getTestDriver(context)
    // Enqueue
    workManager.enqueue(request).result.get()
    // Tells the WorkManager test framework that initial delays are now met.
    testDriver?.setInitialDelayMet(request.id)
    // Get WorkInfo and outputData
    val workInfo = workManager.getWorkInfoById(request.id).get()

    // Assert
    assert(workInfo.state == WorkInfo.State.SUCCEEDED)
}

推荐阅读