测试 enqueueUniqueWork 和 cancelUniqueWork WorkManager 的最佳方法

Best way to test enqueueUniqueWork and cancelUniqueWork WorkManager

在 Android 中测试 Kotlin 中的方法 enqueueUniqueWorkcancelUniqueWork 的最佳方法是什么? 我只找到了使用 Id 测试工作的答案,但我有一个唯一的名称。

两种方法均来自WorkManager class。此 class 是运行时环境的一个元素,因此对其进行测试是 WorkManager.

作者的任务

您可能想做的是通过这些方法测试任务 executed/cancelled 或测试它们是否被调用。

对于第二个选项,请查看名为 Mock 的东西。这是一个特殊的“class”,伪装成您原来的 class,但您可以控制它的行为方式并检查它的使用方式。

经过大量搜索,我找到了这个教程: https://medium.com/@thefallen.class/unit-testing-workmanager-with-dependencies-8ffff7ef5476

还有 android 文档: https://developer.android.com/topic/libraries/architecture/workmanager/how-to/integration-testing

无法仅使用 Mocks 直接测试方法 enqueueUniqueWorkcancelUniqueWork

我需要

这样的库
  • androidx.test:core
  • androidx.work:work-testing
  • org.robolectric:robolectric
由于 androidx.test:core

提供的上下文,

androidx.work:work-testing 允许我初始化一个 Test WorkerManager

@RunWith(RobolectricTestRunner::class)
class ClassTest{
   private lateinit classToTest: ClassToTest
   private lateinit context: Context
   
   @Before
   fun setUp(){
      context = ApplicationProvider.getApplicationContext()
      val config = Configuration.Builder()
            .setWorkerFactory((WorkerFactory.getDefaultWorkerFactory()))
            .setExecutor(SynchronousExecutor())
            .setMinimumLoggingLevel(Log.DEBUG)
            .build()
      WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
   }
}

然后,由于

等行,我设法获得了我独特的排队工作和取消工作的状态
WorkManager.getInstance(context).getWorkInfosForUniqueWork("name").get()[0].state

返回的元素如WorkInfo.State.CANCELLEDWorkInfo.State.ENQUEUED

如果这是最好的方法,我不是 100%,但它允许我测试我想要的东西。希望它可以帮助其他人