如何在单元测试中注入协程调度程序 - 使用 Koin

How to inject coroutine dispatcher in Unit Test - using Koin

我正在使用 Koin 将我的调度程序注入我的 classes

使用 Koin

提取一个 class
class LogsWorker(
    val context: Context,
    workerParameters: WorkerParameters
) : CoroutineWorker(context, workerParameters), KoinComponent {


    private val ioDispatcher: CoroutineDispatcher by inject()
}

koin模块:

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

private fun provideIoDispatcher(): CoroutineDispatcher = Dispatchers.IO

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

您需要在测试中覆盖该 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) 代替