无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员

Posted

技术标签:

【中文标题】无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员【英文标题】:Kotlin internal members not accessible from alternative test source set in Gradle 【发布时间】:2019-11-24 19:32:22 【问题描述】:

在https://docs.gradle.org/current/userguide/java_testing.html#sec:configuring_java_integration_tests 和https://www.michael-bull.com/blog/2016/06/04/separating-integration-and-unit-tests-with-gradle 之后,我们试图将集成测试与普通单元测试分开。

我们遇到的问题是 Kotlin 中的 internal 成员无法从此类测试中访问。根据Kotlin doco,测试源集存在可见性异常。

内部可见性修饰符表示该成员是可见的 在同一个模块中。更具体地说,一个模块是一组 Kotlin 一起编译的文件:

    一个 IntelliJ IDEA 模块; 一个 Maven 项目; 一个 Gradle 源集(测试源集可以访问 main 的内部声明除外); 通过一次 Ant 任务调用编译的一组文件。

除了不尝试访问它们之外,还有其他方法吗?这将需要对数百个测试和整个代码库进行重大重构。

【问题讨论】:

related question 讨论了一些失败的尝试。您是否碰巧找到了解决问题的方法? 【参考方案1】:

通过将以下代码添加到我的自定义 Gradle 插件,我能够获得自定义测试源集以访问 internal 类。

NamedDomainObjectContainer<KotlinWithJavaCompilation<KotlinJvmOptions>> compilations = project
  .getExtensions()
  .getByType(KotlinJvmProjectExtension.class)
  .target.getCompilations();

compilations.getByName(sourceSet.getName())
  .associateWith(compilations.getByName(SourceSet.MAIN_SOURCE_SET_NAME));

我查看了kotlin-gradle-plugin源代码,发现如下: https://github.com/JetBrains/kotlin/blob/v1.3.61/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt#L488-L490

更改后,我的自定义源集中的测试运行良好,但 IntellIJ 仍然显示编译错误。我会进一步看看我是否也能让 IntelliJ 开心

【讨论】:

这是一个有用的指针,但我无法将其转换为 Groovy DSL 中的任何内容(尽管我也在尝试使用 MPP):kotlin ... targets.jvm.compilations.test.associateWith targets.jvm.compilations.main 。似乎associateWith 没有向用户公开。 在 MPP 中,我认为您需要添加对 compileMain kotlin 源集的依赖。有几个对compileMaincompileTest 源集的引用。例如,github.com/JetBrains/kotlin/blob/… 这个答案谈到让IDEA开心:***.com/a/35690003/2740621

以上是关于无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员的主要内容,如果未能解决你的问题,请参考以下文章

Gradle:使用依赖关系jar中的资源作为源集

使一个源集依赖于另一个源集

Gradle with Eclipse - 多个源集时不完整的.classpath

如何使用 gradle kotlin-dsl 添加新的源集

Gradle:如何指定库的两个源集并在项目中添加依赖项

Android Gradle Task-中文