我已经构建了一个基于Maven的项目,该项目在Junit 4 Runner中使用Spek进行测试。
我在Codacy中配置了这个项目,并得到了一个有用的建议,要么记录我的公共类,要么降低它们的可见性(很棒)。
我发现Kotlin编译器似乎认为测试存在于不同的模块中,这使得在我的项目布局下很难进行有效的单元测试。如果类或接口的可见性降低到内部,则测试将不会编译。
请建议一种解决此问题的机制。在这种情况下,是否不可能使用内部可见性修饰符?是否有一个有用的编译器配置或Spek配置可以克服这个问题?我认为这个建议确实是正确的;我不想记录这些类,因为它们是内部的,将来可能会更改,或者文档根本不值得。
我最终发现,这个问题是由internal
可见性应用于已经标记为内部的类的子类和字段引起的。虽然Kotlin在某些情况下允许您这样做,但它似乎进一步限制了这些元素对代码中其他编译单元的可见性,在某种程度上起到了将元素标记为private的作用。我无法计算出应用的确切规则,因为多个元素在同一个文件中,有些元素是嵌套的。
为了缓解这些问题,一旦父类被标记为内部,就不要将子类或字段重新标记为内部。经过这段经历后,我通常还建议每个编译单元组织一个元素(这在Java中是必需的),而不是将大量元素推入一个文件中,因为这可能会造成这种混乱。
我还想提醒那些对Codacy警告感到困惑的人,有些Codacy建议是不可能满足的(例如,我发现将内部接口上的函数标记为双重内部是不可能的——尽管这种做法可以在元素嵌套的某些组合上允许)。