Kotlin:使内部函数对单元测试可见

Posted

技术标签:

【中文标题】Kotlin:使内部函数对单元测试可见【英文标题】:Kotlin: Make an internal function visible for unit tests 【发布时间】:2016-06-11 13:46:02 【问题描述】:

如果测试与生产代码位于不同的模块中(这很常见),使内部函数对测试可见的最佳方法是什么?

在 Java 中,我会将生产代码和测试放在同一个包中,并将要测试的方法包私有(另外,如果将其打包的唯一原因,请添加 @VisibleForTest 注释 -私人而不是私人是测试)。不幸的是,Kotlin 没有包私有的概念。

【问题讨论】:

也许internal 修饰符可以帮助你:kotlinlang.org/docs/reference/visibility-modifiers.html 【参考方案1】:

标有internal 访问修饰符的类和方法将在 Kotlin、Gradle 和 Intellij 的当前版本中工作,以便从测试类访问这些方法。这些工具将主源路径和测试源路径视为同一模块的一部分。

你已经试过了吗?如果它失败了,你应该报告一个错误,因为这已经被报告、修复并且在任何当前版本中都应该没问题。

【讨论】:

是的,这正是我在 Intellij IDEA 15 上尝试过的。我会再次检查我是否使用了最新版本的 IDE 和 Kotlin 插件,并且我的设置是否正确. 最新的 Intellij IDEA 15 是 15.0.4,带有 Kotlin 插件 1.0.0 它现在工作正常,我什至没有安装任何更新。我之前可能做错了什么并且感到困惑。很酷,它正在工作!谢谢。 除非我做错了类似的事情,否则它似乎不适用于非 Kotlin 单元测试(在我的例子中是 Spock + Groovy):( > 这些工具将主源路径和测试源路径视为同一模块的一部分。这种魔法发生在哪里?我正在尝试使用 Buck 来构建和运行我的 Kotlin 测试。【参考方案2】:

可能最简单的解决方案是将取决于内部代码的单元测试与生产代码放在同一模块中,而仅将使用公共 API 的集成测试留在单独的模块中。

这似乎是合理的,因为internal modifier 意味着同一模块内的可见性。

【讨论】:

以上是关于Kotlin:使内部函数对单元测试可见的主要内容,如果未能解决你的问题,请参考以下文章

带有不在标题中的函数的单元测试 C

如何让单元测试访问核心数据模型

如何在 Swift 中对私有或内部函数进行单元测试?

如何在 Cordapp 中对服务和控制器(kotlin)进行单元测试?

使代码内部化,但可用于其他项目的单元测试

在Android上Kotlin的单元测试(KAD22)