【问题标题】:Spek access to Internal Visibility Kotlin ClassesSpek 访问内部可见性 Kotlin 类
【发布时间】:2023-03-11 11:55:01
【问题描述】:

我整理了一个基于 Maven 的项目,该项目使用 Junit 4 Runner 中的 Spek 进行测试。

我在 Codacy 中配置了项目,并得到了一个有用的建议来记录我的公共课程或降低它们的可见性(太棒了)。

我发现 Kotlin 编译器似乎将测试视为存在于不同的模块中,鉴于我的项目布局,这使得进行有效的单元测试变得非常困难。如果类或接口的可见性降低到内部,则测试将无法编译。

请提出解决此问题的机制。在这种情况下是否不能使用内部可见性修饰符?是否有可以克服该问题的有用的编译器配置或 Spek 配置?我认为这个建议确实是正确的;我不希望记录这些类,因为它们是内部的并且将来可能会更改,或者文档根本不值得努力。

【问题讨论】:

  • 你使用的是什么 Kotlin 版本?
  • 我听说有一个 openall kotlin 插件可以“打开”封闭类以进行测试:kotlinlang.org/docs/reference/compiler-plugins.html
  • 如果你用谷歌搜索类似 kotlin mock 的东西,有一些解决方案
  • 我使用的是 Kotlin 1.1.51。

标签: kotlin codacy spek


【解决方案1】:

我最终发现问题是由于将internal 可见性应用于已标记为内部的类的子类和字段。虽然 Kotlin 在某些情况下允许您这样做,但它似乎进一步限制了这些元素对代码中其他编译单元的可见性,在将元素标记为私有时具有一定的效果。我无法计算出应用的确切规则,因为多个元素在同一个文件中,而且有些是嵌套的。

为了缓解此类问题,一旦父类被标记为内部,请勿将子类或字段重新标记为内部。有了这次经验后,我通常还建议为每个编译单元组织一个元素(如 Java 中所要求的那样),而不是将大量元素推送到单个文件中,因为它会造成这种混乱。

我还要提醒那些对 Codacy 警告感到困惑的人,即 Codacy 的一些建议是不可能满足的(例如,我发现将内部接口上的功能标记为双重内部是不可能的——尽管如此可以允许对元素嵌套的某些组合进行练习)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 2014-11-06
    • 2019-04-01
    • 2020-08-29
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多