为啥在我的单元测试中主源代码树中的“内部”类型不可见?

Posted

技术标签:

【中文标题】为啥在我的单元测试中主源代码树中的“内部”类型不可见?【英文标题】: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 来重新创建您的项目以查看您是否修复它。 (并检查模块)...显示您的目录结构以及构建文件会有所帮助。 所以,你知道它正常工作,只有你有足够的证据来知道什么与正常不同。将其与您以前的项目进行比较,检查模块,看看有什么不同。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

有趣的是......正如我所提到的,我删除了通过findProject() 重命名项目的行,并且IntelliJ 没有抱怨单元测试中对internal 类的引用。 . 如果我恢复findProject() 行,一切都会继续工作...¯_(ツ)_/¯

以上是关于为啥在我的单元测试中主源代码树中的“内部”类型不可见?的主要内容,如果未能解决你的问题,请参考以下文章

单元测试与 Spring 的集成测试

为啥我在我的 Rspec 模型测试中得到单元化常量?

如何将预单元测试步骤添加到我的*** Makefile.am?

为啥 PyCharm 无法运行单元测试?

为啥我安装类型时没有解决类型错误?

词频统计单元测试