簡體   English   中英

如何在單元測試中注入協程調度程序 - 使用 Koin

[英]How to inject coroutine dispatcher in Unit Test - using Koin

我正在使用 Koin 將調度程序注入我的課程

使用 Koin 提取一類

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 類進行單元測試,我需要注入一個 coroutineTestDispatcher。 我怎么能那樣做? 我在任何地方都找不到任何例子。

您需要在測試中覆蓋該 bean 定義,當您加載時,您正在啟動 koin 並加載模塊。

你可以這樣做: factory(override = true) { provideYourTestingDispatcher }

在此處閱讀更多相關信息

盡管上述方法可行,但我發現使用構造函數注入更優雅,例如:

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)代替

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM