无法从 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 源集的依赖。有几个对compileMain
和compileTest
源集的引用。例如,github.com/JetBrains/kotlin/blob/…
这个答案谈到让IDEA开心:***.com/a/35690003/2740621以上是关于无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员的主要内容,如果未能解决你的问题,请参考以下文章