Oye, estoy teniendo este tipo de problema extraño. No entiendo por qué esto está causando en mi prueba unitaria. ¿Puede alguien por favor guiarme lo que falta en mi lado.
Exception in thread "Test worker" java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize. For tests Dispatchers.setMain from kotlinx-coroutines-test module can be used at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:118) at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:96) at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:319) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30) at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47) at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.mockk.proxy.jvm.advice.MethodCall.call(MethodCall.kt:14) at io.mockk.proxy.jvm.advice.SelfCallEliminatorCallable.call(SelfCallEliminatorCallable.kt:14) .....este es mi archivo de prueba de unidad. No entiendo por qué esto está causando el problema.
UnitTest.kt
class XYZViewModelTest { @get:Rule val koinTestRule = KoinTestRule.create { modules(utilsModule) } @get:Rule val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule() private lateinit var mockViewModel: XYZViewModel ..../// more declartions @Before fun setUp() { MockKAnnotations.init(this, relaxed = true) loadKoinModules(module { listOf( factory { mockSessionHelper } ) }) mockViewModel = spyk(XYZViewModel()) } ./// function }Cuando realice pruebas unitarias, debe reemplazar Dispatchers.Main con un despachador diferente al que tiene de forma predeterminada, porque la implementación predeterminada de Dispatchers.Main no existe cuando no se ejecuta una aplicación completa. Para hacer esto, debe tener la kotlinx-coroutines-test si aún no la tiene:
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0'Puede crear una regla de prueba de rutina para configurar esto antes y después de cada prueba, de modo que pueda simplificar el manejo de esto en cada una de sus clases de prueba.
Pon esto en su propio archivo:
@ExperimentalCoroutinesApi class MainDispatcherRule(val dispatcher: TestDispatcher = StandardTestDispatcher()): TestWatcher() { override fun starting(description: Description?) = Dispatchers.setMain(dispatcher) override fun finished(description: Description?) = Dispatchers.resetMain() }Y luego agregue la regla a su clase de prueba:
@ExperimentalCoroutinesApi @get:Rule val mainDispatcherRule = MainDispatcherRule() Sus pruebas que usan corrutinas deben usar y devolver la función runTest para que se vean así:
@ExperimentalCoroutinesApi @Test fun fooTest() = runTest { //... } Lo siento si me he perdido algo. Hay muchos cambios en la última versión 1.6.0 kotlinx-coroutines-test y todavía no estoy al día.