【发布时间】:2021-10-06 15:18:18
【问题描述】:
在 Android 的 Kotlin 中测试 enqueueUniqueWork 和 cancelUniqueWork 方法的最佳方法是什么?
我只找到了使用 Id 进行测试工作的答案,但我有一个唯一的名称。
【问题讨论】:
标签: kotlin testing junit mockito
在 Android 的 Kotlin 中测试 enqueueUniqueWork 和 cancelUniqueWork 方法的最佳方法是什么?
我只找到了使用 Id 进行测试工作的答案,但我有一个唯一的名称。
【问题讨论】:
标签: kotlin testing junit mockito
经过大量搜索,我找到了这个教程: 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 无法直接测试 enqueueUniqueWork 和 cancelUniqueWork 方法。
我需要诸如
之类的库androidx.test:coreandroidx.work:work-testingorg.robolectric:robolectricandroidx.work:work-testing 允许我初始化一个 Test WorkerManager,这要归功于androidx.test:core 提供的上下文
@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.CANCELLED或WorkInfo.State.ENQUEUED等元素
如果这是最好的方法,我不是 100%,但它允许我测试我想要的。希望它可以帮助其他人
【讨论】:
这两种方法都来自WorkManager 类。这个类是运行环境的一个元素,所以测试它们是WorkManager作者的任务。
您可能想要做的是测试由这些方法执行/取消的任务或测试它们是否被调用。
对于第二个选项,请查看名为 Mock 的内容。这是一个特殊的“类”,它假装您的原始类,但您可以控制它的行为方式并检查它的使用方式。
【讨论】: