【问题标题】:How to inject coroutine dispatcher in Unit Test - using Koin如何在单元测试中注入协程调度程序 - 使用 Koin
【发布时间】:2021-10-03 13:45:45
【问题描述】:

我正在使用 Koin 将调度程序注入到我的类中

使用 Koin 提取一个类

class LogsWorker(
    val context: Context,
    workerParameters: WorkerParameters
) : CoroutineWorker(context, workerParameters), KoinComponent {


    private val ioDispatcher: CoroutineDispatcher by inject()
}

koinModule:

val appModule = module {
    factory { provideIoDispatcher() }
}

private fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO

如果我想对我的 LogsWorker 类进行单元测试,我需要注入一个 coroutineTestDispatcher。 我怎么能那样做?我在任何地方都找不到任何例子。

【问题讨论】:

    标签: android unit-testing kotlin-coroutines koin


    【解决方案1】:

    您需要在测试中覆盖该 bean 定义,当您加载时,您将启动 koin 并加载模块。

    你可以这样做: factory(override = true) { provideYourTestingDispatcher }

    阅读更多关于它的信息here

    虽然上述方法可行,但我发现使用构造函数注入更优雅,例如:

    class LogsWorker(
        val context: Context,
        workerParameters: WorkerParameters,
        private val ioDispatcher: CoroutineDispatcher
    ) : CoroutineWorker(context, workerParameters)
    

    那么你可以在koin中指定LogsWorker的定义,如:

    factory { (context: Context, workerParameters: WorkerParameters) -> LogsWorker(context, workerParameters, get()) }
    

    在测试中,您只需传入测试调度程序即可。 更多信息:https://insert-koin.io/docs/reference/koin-core/injection-parameters#defining-an-injected-parameter

    更新: override 已弃用,您可以改用 KoinApplication.allowOverride(true)

    【讨论】:

    • 非常感谢您抽出宝贵时间回复和编辑您的答案?。我发现了一些我不知道的关于 Koin 的东西——感觉好像我没有正确的文档。
    猜你喜欢
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    相关资源
    最近更新 更多