我创建了两个类:
@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
源集,以及您已有的 main
和 test
源集。您在 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/