reactivestate-core-test
Utilities for writing coroutine tests.
Unit tests with coroutines
The CoroutineTest base class provides some often useful helpers for working with coroutines.
class MyTest : CoroutineTest() {
    // This works because MainScope/Dispatchers.Main is automatically set up correctly by CoroutineTest
    val viewModel = MyViewModel()
    // Let's use a mock to test the events emitted by MyViewModel
    val events: MyEvents = mock()
    @Before
    fun setup() {
        // You can access the TestCoroutineScope directly to launch some background processing.
        // In this case, let's process MyViewModel's events.
        testCoroutineScope.launch {
            viewModel.eventNotifier.collect { events.it() }
        }
    }
    @Test
    fun someTest() = runTest {
        viewModel.doSomething()
        advanceUntilIdle()
        verify(events).someEvent()
    }
}Content copied to clipboard
This also sets up a global dispatchers variable which you can use in all of your code instead of passing a CoroutineDispatcher around as arguments:
// Use this instead of Dispatchers.IO. In unit tests this will automatically use
// the TestCoroutineDispatcher instead. Outside of unit tests it points to Dispatchers.IO.
// You can also define your own overrides if you want.
withContext(dispatchers.io) {
    // do some IO
}Content copied to clipboard
If you can't derive from CoroutineTest directly (e.g. because you have some other base test class), you can alternatively use composition with the CoroutineTestRule:
class MyTest {
    val rule = CoroutineTestRule()
    @Test
    fun someTest() = rule.runTest {
        // ...
    }
}Content copied to clipboard