![](/img/trans.png)
[英]Transfer Coroutine Dispatcher's Tasks to another Dispatcher
[英]Which coroutine dispatcher to inject when testing a Kotlin console
我有一個后端 springboot Kotlin 應用程序,其中包含一些用於並行 IO 操作的簡單協程代碼。 它看起來像這樣
@Service
class AccountService(
private val client: ApiClient
private val coroutineDispatcher: CoroutineDispatcher
) {
fun getAccount(): AccountDTO {
return runBlocking(coroutineDispatcher) {
val foo = async {
client.getFoo() //some long operation
}
val bar = async {
client.getBar() //some other operation
}
AccountDTO(foo.await(), bar.await())
}
}
}
現在在生產中,我可以注入一個Dispatchers.IO
調度程序,一切正常。 但是在測試時我不想要多線程。 我想注入Dispatcher.Main
但它適用於 android 應用程序。 或者,我不想注入任何內容,讓范圍從父級繼承並在主線程上運行, runBlocking{}
的工作方式沒有任何參數。 但我不知道該怎么做。 我應該使用Dispatchers.Unconfined
嗎? 據我了解,除非我自己明確啟動另一個線程,否則它將保留在主線程上。
這里的標准做法是什么?
或者,我不想注入任何內容,讓范圍從父級繼承並在主線程上運行,runBlocking{} 的工作方式沒有任何參數。 但我不知道該怎么做
如果您在此處可以控制getAccount()
,則應將其suspend
並避免在此級別runBlocking
。 如果您只是在項目中引入協程,那么第一步當然可以,但我鼓勵您盡快繼續調用調用堆棧。 這樣,您將受益於上下文繼承,並避免在其他協程決定調用您的服務時阻塞線程。
現在,您可以使用kotlinx-coroutines-test
進行測試,它們提供了您可以使用的測試調度程序,甚至可以讓您控制虛擬時間和測試超時等。但是請注意,由於虛擬時間,您不能使用這種調用不屬於虛擬時間的實際系統的代碼調度程序(例如某些外部服務,或者只是使用硬編碼的非測試調度程序的一段代碼)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.