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

37

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

在Java中,我会将生产代码和测试代码放在同一个包中,并使要测试的方法包范围内(此外,如果将其设置为包范围而不是私有的唯一原因是测试,则添加@VisibleForTest注释)。不幸的是,Kotlin没有包范围的概念。


2
也许 internal 修饰符可以帮助你解决这个问题:https://kotlinlang.org/docs/reference/visibility-modifiers.html - marcospereira
3个回答

29

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

您已经尝试过这个了吗?如果失败了,您应该报告一个 bug,因为这已经被报告、修复并且应该在任何当前版本中都可以正常运行。


是的,这正是我尝试使用Intellij IDEA 15的方式。我会仔细检查我的IDE和Kotlin插件是否都是最新版本,并且我的设置是否正确。 - Jan Pomikálek
最新的Intellij IDEA 15版本是15.0.4,带有Kotlin插件1.0.0。 - Jayson Minard
现在它正常工作了,我甚至没有安装任何更新。我之前可能做错了什么,感到困惑。很酷它正在工作!谢谢。 - Jan Pomikálek
4
除非我也犯了类似的错误,否则它似乎无法从非 Kotlin 单元测试中工作,尽管(在我的情况下是)使用 Spock + Groovy :( - Gregor Petrin
@GregorPetrin Spock问题似乎还没有得到解决:https://youtrack.jetbrains.com/issue/KT-525 - neu242
显示剩余3条评论

6

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

这似乎是合理的,因为internal修饰符的意思恰好是在同一模块内的可见性。


1
在我的情况下,这不起作用是因为我们在settings.gradle中重命名了项目以添加前缀,而Kotlin似乎不喜欢这样做。 一旦我们删除了重命名项目的行,我们就能够在test/内部看到来自main/的内部成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接