Лично я скопировал решение из RxJava2: если ваш тест выполняется с потоком RxJava2, который включает в себя два или более различных планировщика, вы, конечно, хотите, чтобы все они фактически выполнялись в потоке одного .Вот как это делается с тестированием RxJava2:
@BeforeClass
public static void prepare() {
RxJavaPlugins.setComputationSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setIoSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setNewThreadSchedulerHandler(scheduler -> Schedulers.trampoline());
RxJavaPlugins.setSingleSchedulerHandler(scheduler -> Schedulers.trampoline());
RxAndroidPlugins.setMainThreadSchedulerHandler(scheduler -> Schedulers.trampoline());
}
Я сделал то же самое для сопрограмм.Просто создали класс, который собирает диспетчеров, но эти диспетчеры могут быть изменены.
object ConfigurableDispatchers {
@JvmStatic
@Volatile
var Default: CoroutineDispatcher = Dispatchers.Default
@JvmStatic
@Volatile
var Main: MainCoroutineDispatcher = Dispatchers.Main
...
}
А внутри @BeforeClass
метода, который я вызываю
@ExperimentalCoroutinesApi
fun setInstantMainDispatcher() {
Main = object : MainCoroutineDispatcher() {
@ExperimentalCoroutinesApi
override val immediate: MainCoroutineDispatcher
get() = this
override fun dispatch(context: CoroutineContext, block: Runnable) {
block.run()
}
}
}
, который будет гарантировать, что блок будетбыть выполненным в вызывающем потоке.
Это единственная альтернатива, которую я нашел для внедрения в конструктор.