-
Notifications
You must be signed in to change notification settings - Fork 0
Why do we need a Dispatcher as a rule to test coroutines
Devrath edited this page Jul 11, 2021
·
3 revisions
- Dispatchers are not available for the
test
andandroidTest
packages so when testing the live data. There might be a possibility of failure. - Dispatchers rely upon the Main looper and available only during the execution of production code.
- So we need to define a rule to handle the live data.
@ExperimentalCoroutinesApi class MainCoroutineRule( private val dispatcher: CoroutineDispatcher = TestCoroutineDispatcher() ) : TestWatcher(), TestCoroutineScope by TestCoroutineScope(dispatcher) {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(dispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
cleanupTestCoroutines()
Dispatchers.resetMain()
}
}
- Here in the
starting(..)
method we replace our main dispatcher with the test dispatcher. - In the
finished(..)
method before we complete we clean up the co-routines if any are running and replace the test dispatcher again with the main dispatcher. - Usage of the rule
@ExperimentalCoroutinesApi
class ShoppingViewModelTest {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@get:Rule
var mainCoroutineRule = MainCoroutineRule()
@Test
fun `someTestCase`() {
// Test case
}
}
- Rule will apply to all the test cases