如何在单元测试中注入协程调度程序 - 使用 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)
代替
我正在使用 Koin 将我的调度程序注入我的 classes
使用 Koin
提取一个 classclass 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)
代替