使用testImplementation project(:deepestModule)在另一个模块中进行测试时,无法解析的引用

时间:2019-11-25 20:47:58

标签: unit-testing gradle kotlin

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

我做了什么:

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

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

这有招吗?

1 个答案:

答案 0 :(得分:2)

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

话虽这么说,但有一个合法的用例可以共享模拟和其他测试资源。我们通常将其称为测试夹具,看起来这正是您想要的。

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

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

顺便说一句,您在Kotlin DSL上使用Groovy DSL是否有特定原因?既然您还是在构建Kotlin项目,那么后者似乎更合适。