У меня есть класс, который выглядит примерно так:
class Foo {
private val scope = Job() + Dispatchers.IO
val emissions = PublishSubject.create<Bar>()
fun doSomething() {
scope.launch {
// Do a whole bunch of work...
withContext(Dispatchers.Main) emissions.onNext(bar)
}
}
}
И я пытаюсь найти способ его модульного тестирования. Я пытался сделать область видимости инъекционной и написать что-то вроде
@Test fun testFoo() = runBlockingTest {
Dispatchers.setMain(TestCoroutineDispatcher())
val foo = Foo(this)
foo.doSomething()
foo.emissions.assertStuff()
}
, но это не сработало. Утверждение происходит до того, как завершится сопрограмма внутри doSomething()
.
Я также пытался сделать этот диспетчер инъекционным, предоставляя Dispatchers.Unconfined
, но это тоже не помогло. Что-то не так с этим подходом?