Running unit tests for ViewModels on Android where you have LiveData objects can be tricky. It is very possible that you get this exception:
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.
Creating a custom rule won’t work if you are using JUnit 5 (Jupiter). The proper way is to have an extension like this one:
import androidx.arch.core.executor.ArchTaskExecutor
import androidx.arch.core.executor.TaskExecutor
import org.junit.jupiter.api.extension.AfterEachCallback
import org.junit.jupiter.api.extension.BeforeEachCallback
import org.junit.jupiter.api.extension.ExtensionContext
class InstantExecutorExtension : BeforeEachCallback, AfterEachCallback {
override fun beforeEach(context: ExtensionContext?) {
ArchTaskExecutor.getInstance().setDelegate(object : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) = runnable.run()
override fun postToMainThread(runnable: Runnable) = runnable.run()
override fun isMainThread(): Boolean = true
})
}
override fun afterEach(context: ExtensionContext?) {
ArchTaskExecutor.getInstance().setDelegate(null)
}
}
And then over the test class that you have, you have to add the following annotation:
@ExtendWith(InstantExecutorExtension::class)
class MainActivityViewModelTest { }
Ta-Da. This is all you need in order to test LiveData classes.
One thought on “Running unit tests for LiveData with Jupiter on Android”