android - 分享CoroutineExecutorExtension的定义

标签 android unit-testing kotlin kotlin-coroutines junit5

我创建了两个类:

@ExperimentalCoroutinesApi
open 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)
    }
}

@ExperimentalCoroutinesApi
class CoroutineExecutorExtension : InstantExecutorExtension() {

    private val testCoroutineDispatcher = TestCoroutineDispatcher()

    override fun beforeEach(context: ExtensionContext?) {
        super.beforeEach(context)
        Dispatchers.setMain(testCoroutineDispatcher)
    }

    override fun afterEach(context: ExtensionContext?) {
        super.afterEach(context)
        Dispatchers.resetMain()
        testCoroutineDispatcher.cleanupTestCoroutines()
    }
}

我正在使用这些类为使用协程和 livedata 的方法编写单元测试。 我遇到的问题是我不知道如何在不同的模块中共享这些类。 如果我在 test 文件夹中定义它们,那么我可以构建这些类,但它们在其他模块中不可见。 如果我在 main 文件夹中定义,则会出现编译时错误。 我该怎么做才能避免在所有模块中定义这些类?

更新 为了遵循@Sam的建议,我创建了一个包含文件夹中两个类的模块:

.\unittest\src\testFixtures\java\com\name\terminal\unittest

该模块的build.gradle文件使用插件:

plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'java-test-fixtures'
}

在我想要使用 CoroutineExecutorExtension 的模块中,我已导入单元测试模块的项目:

    testImplementation(testFixtures(project(":unittest")))

问题是 testFixtures 文件夹中的类不可见。

编辑

此方法不适用于 Android 库。我无法使用 java 库,因为我需要能够包含 Androidx 依赖项。

最佳答案

如果您使用 Gradle,则test fixtures插件是一个合适的解决方案。该插件是内置的,因此您只需将 java-test-fixtures 添加到您的 plugins block 即可。

plugins {
    `java-test-fixtures`
}

这会自动创建一个新的 testFixtures 源集,以及您已有的 maintest 源集。您在 src/testFixtures/kotlin 中编写的代码将从您的测试中可见,并且可以访问 main 中的所有内容。测试装置所需的任何内容(例如,对 kotlinx-coroutines 或测试框架的依赖项)都应添加为 dependencies of the test fixtures .

您还可以add dependencies on test fixtures来自另一个模块。例如,如果 module-b 需要使用 module-a 中的测试装置,那么在 module-b 的 Gradle 构建脚本中,您可以可以添加:

dependencies {
    testImplementation(testFixtures(project(":module-a")))
}

我给出的示例适用于 Kotlin 构建脚本,但您可以在链接文档中找到 Groovy 等效项。

关于android - 分享CoroutineExecutorExtension的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69866808/

相关文章:

java - 单元测试失败 : java. lang.RuntimeException : Method getMainLooper in android. os.Looper 未模拟

android - Kotlin 通用抽象函数

multithreading - 在 Kotlin Native 中,如何将对象保存在单独的线程中,并在不使用 C 指针的情况下从任何其他线程中改变其状态?

android - 在 Log 中打印 bool 值

android - MapBox queryRenderedFeatures 返回太多值

android - qmessagebox 问题,无法更改其位置

javascript - 从 ngOnInit 调用的 Angular 2 单元测试函数

android/busybox/termux 测试环境

c# - 如何对该方法进行单元测试(使用剪贴板和文件系统)?

.net - 使用级联 CRUD 操作进行单元测试和假存储库实现