[Kotlin] runBlockingTestとは

runBlockingTestはCoroutineを起動するlaunchやasync、delay関数を即時実行する効果がある。

ただ、テスト対象でCoroutineを起動しているのか、起動していないのかで対応が分かれる。

outineを起動しているのか、起動していないのかで対応が分かれる。

kotlinx.coroutines/kotlinx-coroutines-test at master · Kotlin/kotlinx.coroutines
Library support for Kotlin coroutines . Contribute to Kotlin/kotlinx.coroutines development by creating an account on GitHub.

上記の

Testing regular suspend functions

Testing launch or async

が参考になる。Coroutineを起動していないのであればdelay関数をrunBlockingTestで包めばOKで、起動している場合はadvanceTimeByを使用する必要がある。advanceTimeByはrunBlockingTestを使うと使える。

あとこちらの動画も参考に。

Couroutineを起動するUnit TestはTestCoroutineDispatcherというスレッドを用意して、テストのスレッドとテスト対象の処理のスレッドを同じにする必要がある。そうしてないとテストのスレッドとテスト対象のスレッドが非同期に走り、テスト対象のスレッドの処理が終わる前に評価が始まるからだ。かつlaunchを即時実行するためにrunBlockingTestも使用する必要がある。