【问题标题】:Why aren't "internal" types in the main source tree visible in my unit tests?为什么在我的单元测试中主源代码树中的“内部”类型不可见?
【发布时间】:2018-11-19 00:50:10
【问题描述】:

我在 IntelliJ 中有一个 Kotlin 项目,其结构如下:

  • main/com/foo/Bar.kt
  • test/com/foo/BarTest.kt

其中Bar 定义为:

internal class Bar

而BarTest 类似于:

class BarTest {
    private lateinit var bar: Bar
}

在 IntelliJ 中,我在引用 Bar 时遇到编译器错误,消息如下:

无法访问“Bar”:它在“com.foo”内部

然而,测试是从命令行编译和运行的(通过 Gradle)。

使用 IntelliJ 时如何抑制/消除此错误?

我的设置是:

  • macOS 10.14.1
  • IntelliJ 2018.2.6
  • Kotlin 1.3.10

【问题讨论】:

  • 有一些争论,但共识似乎是you should only write unit tests for the public API。至少,您针对非公共代码编写的任何测试都不应该被视为生产测试套件的一部分。
  • 问题是我过去设置过这样的项目(我正在通过 GitHub 回顾它们)。我最近从我的操作系统上重新安装了所有东西,所以我想也许我错过了我之前应用的一些 IntelliJ 配置设置,或者最近的构建已经开始采用这种行为。
  • 技术上它是允许的(内部跨度 main/test 在同一个模块中),并且必须在某处存在错误配置。或者您的项目的主要/测试方面不在同一个 IntelliJ 模块中?您是否使用build.gradle 作为源创建了您的项目?也许通过打开build.gradle 来重新创建您的项目以查看您是否修复它。 (并检查模块)...显示您的目录结构以及构建文件会有所帮助。
  • 所以,你知道它正常工作,只有你有足够的证据来知道什么与正常不同。将其与您以前的项目进行比较,检查模块,看看有什么不同。

标签: intellij-idea kotlin


【解决方案1】:

我使用同一个 IntelliJ 安装同时打开了两个项目:

  • 在以前的项目中,我能够对位于 main 源树中的 internal 类进行单元测试(都在同一个 IntelliJ 模块的边界内)
  • 我无法在其中重现此设置的当前项目

IntelliJ 在以前的设置中仍然没有给出错误的事实让我得出结论,这个问题与我的 IntelliJ 设置无关。正如@JaysonMinard 建议的那样,我查看了 Gradle 配置的差异。

区别在于当前项目的顶层settings.gradle,我使用的是重命名模块的约定,唉:

findProject(':module-blah')?.name = 'blah'

...以便用较短的名称引用我的 Gradle 项目,同时在我的项目浏览器中连续列出它们(而不是按字母顺序与其他文件一起分散)。删除此快捷方式恢复了我在单元测试中寻找的行为。

【讨论】:

  • 有趣的是......正如我所提到的,我删除了通过findProject() 重命名项目的行,并且IntelliJ 没有抱怨单元测试中对internal 类的引用。 . 如果我恢复findProject() 行,一切都会继续工作...¯_(ツ)_/¯
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2020-07-12
相关资源
最近更新 更多