Last active
September 6, 2024 18:09
-
-
Save alvindizon/227735c2e21763368cc248912476cf0f to your computer and use it in GitHub Desktop.
JUnit extensions for LiveData(InstantExecutor), RxJava2, and Coroutines
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import kotlinx.coroutines.Dispatchers | |
import kotlinx.coroutines.ExperimentalCoroutinesApi | |
import kotlinx.coroutines.test.TestCoroutineDispatcher | |
import kotlinx.coroutines.test.TestCoroutineScope | |
import kotlinx.coroutines.test.resetMain | |
import kotlinx.coroutines.test.setMain | |
import org.junit.jupiter.api.extension.AfterEachCallback | |
import org.junit.jupiter.api.extension.BeforeEachCallback | |
import org.junit.jupiter.api.extension.ExtensionContext | |
@ExperimentalCoroutinesApi | |
class CoroutineExtension( | |
private val dispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher() | |
) : BeforeEachCallback, AfterEachCallback, TestCoroutineScope by TestCoroutineScope(dispatcher) { | |
override fun beforeEach(context: ExtensionContext?) { | |
Dispatchers.setMain(dispatcher) | |
} | |
override fun afterEach(context: ExtensionContext?) { | |
cleanupTestCoroutines() | |
Dispatchers.resetMain() | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.annotation.SuppressLint | |
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 { | |
@SuppressLint("RestrictedApi") | |
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 | |
}) | |
} | |
@SuppressLint("RestrictedApi") | |
override fun afterEach(context: ExtensionContext?) { | |
ArchTaskExecutor.getInstance().setDelegate(null) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TestSchedulerExtension : BeforeTestExecutionCallback, AfterTestExecutionCallback { | |
override fun beforeTestExecution(context: ExtensionContext?) { | |
RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() } | |
RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } | |
RxJavaPlugins.setComputationSchedulerHandler { Schedulers.trampoline() } | |
RxJavaPlugins.setNewThreadSchedulerHandler { Schedulers.trampoline() } | |
RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() } | |
} | |
override fun afterTestExecution(context: ExtensionContext?) { | |
RxJavaPlugins.reset() | |
RxAndroidPlugins.reset() | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@ExperimentalCoroutinesApi | |
@ExtendWith(value = [InstantExecutorExtension::class, RxSchedulerExtension::class, CoroutineExtension::class]) | |
class SampleViewModelTest { | |
.... | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Repo instant-task-executor-extension provides a packaged version of this
InstantExecutorExtension
.No need to copy the code anymore, now include it with just one line:
dependencies { testImplementation 'io.github.neboskreb:instant-task-executor-extension:1.0.0' }