Spek 访问 Internal Visibility Kotlin 类

Spek access to Internal Visibility Kotlin Classes

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

我在 Codacy 中配置了这个项目,并得到了一个有用的建议,要么记录我的 public 类 要么降低他们的可见性(很好)。

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

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

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

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

对于那些对 Codacy 警告感到困惑的人,我还要指出一些 Codacy 建议无法满足(例如,我发现将内部接口上的函数标记为双重内部是不可能的 - 尽管在某些元素嵌套组合中可以允许这种做法)。