使用 testImplementation project(:deepestModule) 在另一个模块中测试时未解析的引用

Vas*_*Vas 3 unit-testing gradle kotlin

我有一个多模块项目设置。在测试的时候,我发现我一直在重新定义每个模块中的一些模拟。所以我希望在最深的模块中定义我的模拟并在外部模块中重用它

我做了什么:

  1. 我将模拟定义放入测试源集 val mock = Mock(val id: String = "blah")
  2. 调整了外部模块构建文件说 testImplementation project(:deepestModule)
  3. 在外部模块测试中,我像这样引用模拟 assertThat(mock.id).isEqualTo("blah")

没有编译错误,但是当我运行外部测试时,构建失败,对模拟的引用未解析。

这有什么窍门吗?

Bjø*_*ter 11

一个项目中的测试类不会暴露给其他项目,甚至不会暴露给其他项目的测试。这是设计使然。项目中的单元测试通常特定于该项目,不应泄漏到任何其他项目的类路径中。

话虽如此,共享模拟和其他测试资源有一个合法的用例。我们通常将这些称为测试装置,看起来这正是您想要的。

如果您使用的是 Gradle 5.6 或更高版本,则有直接支持。您必须应用该java-test-fixtures插件并将定义模拟的 Kotlin 测试源移动到src/testFixtures/kotlin. 实际的单元测试仍应驻留在test源集中。然后可以在其他项目中使用该装置testImplementation(testFixtures(project(":deepestModule")))。您可以在此处的 Gradle 用户指南中阅读更多相关信息。

如果您使用的是旧版本的 Gradle,则必须将测试装置与主要源代码分开。因此,在这种情况下,您必须使用测试代码创建一个新的子项目。在本项目中,将源放在main源集中,不要使用test配置。像普通库一样编写它,即使它仅用于测试。然后您可以按照您已经尝试过的方式使用它testImplementation(project(:deepestModule))

顺便说一下,您在 Kotlin DSL 上使用 Groovy DSL 有什么特别的原因吗?由于您无论如何都在构建 Kotlin 项目,因此后者似乎更合适。