簡體   English   中英

測試 Kotlin 控制台時注入哪個協程調度程序

[英]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.

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