Lukasz Kalnik
07/25/2025, 8:57 AMTestScope
, how can I manually control the passing of virtual time inside a suspending function?
suspend fun doSomethingDelayed() {
delay(10.seconds)
println("Delayed action completed")
}
Lukasz Kalnik
07/25/2025, 8:58 AM"test do something delayed" {
doSomethingDelayed()
testCoroutineScheduler.advanceTimeBy(5.seconds)
testCoroutineScheduler.runCurrent()
println("5 seconds passed")
testCoroutineScheduler.advanceTimeBy(5.seconds)
testCoroutineScheduler.runCurrent()
println("Test completed")
}
Lukasz Kalnik
07/25/2025, 8:58 AMDelayed action completed
5 seconds passed
Test completed
Albert Chang
07/25/2025, 10:14 AMlaunch { doSomethingDelayed() }
.Lukasz Kalnik
07/25/2025, 10:21 AMadvanceTimeBy()
inside or outside of launch()
?Dmitry Khalanskiy [JB]
07/25/2025, 10:22 AMadvanceTimeBy()
can be replaced by a delay
in most cases.Albert Chang
07/25/2025, 10:23 AMLukasz Kalnik
07/25/2025, 10:27 AMLukasz Kalnik
07/25/2025, 10:27 AM"test do something delayed" {
launch {
doSomethingDelayed()
}
delay(5.seconds)
println("5 seconds passed")
delay(5.seconds)
println("Test completed")
}
Lukasz Kalnik
07/25/2025, 10:28 AMadvanceTimeBy()
not work as expected here?Dmitry Khalanskiy [JB]
07/25/2025, 10:32 AMLukasz Kalnik
07/25/2025, 10:33 AMDmitry Khalanskiy [JB]
07/25/2025, 10:35 AM"test do something delayed" {
launch {
doSomethingDelayed()
}
advanceUntilIdle(5.seconds)
println("5 seconds passed")
advanceUntilIdle(5.seconds)
println("Test completed")
}
Dmitry Khalanskiy [JB]
07/25/2025, 10:57 AMadvanceTimeBy(duration)
stops right before executing the tasks scheduled to execute duration
later. To execute those tasks, advanceTimeBy
should be followed by runCurrent
. This gives much more flexible control in the technical scenarios where manually controlling virtual time is actually necessary.Lukasz Kalnik
07/25/2025, 12:06 PMadvanceTimeBy()
anymore. It must lie somehow in my Kotest configuration in my main project.