Kotlin:使内部函数对单元测试可见
Kotlin: Make an internal function visible for unit tests
如果测试与生产代码位于不同的模块中(这很常见),使内部函数对测试可见的最佳方法是什么?
在 Java 中,我会将生产代码和测试放在同一个包中,并将要测试的方法设为私有包(另外,添加一个 @VisibleForTest
注释,如果让它包私有而不是私有的唯一原因是测试)。不幸的是,Kotlin 没有 package-private 的概念。
可能最简单的解决方案是根据内部代码将单元测试与生产代码放在同一个模块中,只留下集成测试,它使用 public API,在单独的模块。
这似乎是合理的,因为 internal
modifier 表示同一模块内的可见性。
类 和标有 internal
访问修饰符的方法将在当前版本的 Kotlin、Gradle 和 Intellij 中工作,用于从测试 类 访问这些方法。这些工具将主源路径和测试源路径视为同一模块的一部分。
你试过了吗?如果它失败了,你应该报告一个错误,因为这已经被报告、修复并且在任何当前版本中都应该没问题。
在我的例子中,它不起作用,因为我们在 settings.gradle
中重命名了我们的项目以添加前缀,而 Kotlin 似乎不喜欢那样。
一旦我们删除了重命名项目的行,我们就能够在 test/
中看到来自 main/
的内部成员。
如果测试与生产代码位于不同的模块中(这很常见),使内部函数对测试可见的最佳方法是什么?
在 Java 中,我会将生产代码和测试放在同一个包中,并将要测试的方法设为私有包(另外,添加一个 @VisibleForTest
注释,如果让它包私有而不是私有的唯一原因是测试)。不幸的是,Kotlin 没有 package-private 的概念。
可能最简单的解决方案是根据内部代码将单元测试与生产代码放在同一个模块中,只留下集成测试,它使用 public API,在单独的模块。
这似乎是合理的,因为 internal
modifier 表示同一模块内的可见性。
类 和标有 internal
访问修饰符的方法将在当前版本的 Kotlin、Gradle 和 Intellij 中工作,用于从测试 类 访问这些方法。这些工具将主源路径和测试源路径视为同一模块的一部分。
你试过了吗?如果它失败了,你应该报告一个错误,因为这已经被报告、修复并且在任何当前版本中都应该没问题。
在我的例子中,它不起作用,因为我们在 settings.gradle
中重命名了我们的项目以添加前缀,而 Kotlin 似乎不喜欢那样。
一旦我们删除了重命名项目的行,我们就能够在 test/
中看到来自 main/
的内部成员。