Spek доступ к классам внутренней видимости Kotlin
Я собрал проект на основе Maven, который использует Spek в Junit 4 Runner для тестирования.
Я настроил проект в Codacy и получил полезное предложение, чтобы либо задокументировать мои публичные классы, либо уменьшить их видимость (отлично).
Я обнаружил, что компилятор Kotlin, по-видимому, рассматривает тесты как существующие в другом модуле, что делает очень трудным проведение эффективного модульного тестирования с учетом схемы моего проекта. Тесты не будут компилироваться, если видимость классов или интерфейсов сведена к внутренней.
Пожалуйста, предложите механизм, чтобы исправить это. Разве нельзя в этой ситуации использовать модификатор внутренней видимости? Есть ли полезная конфигурация компилятора или конфигурация Spek, которая может решить эту проблему? Я думаю, что предложение действительно верно; Я не хочу документировать классы, потому что они являются внутренними и могут измениться в будущем, или документация просто не стоит усилий.
1 ответ
В конце концов я обнаружил, что проблема возникла в результате применения internal
видимость для подклассов и полей класса, который уже был помечен как внутренний. Хотя Kotlin позволит вам сделать это в некоторых случаях, он, по-видимому, еще больше ограничивает видимость этих элементов для других модулей компиляции в других частях кода, что в некоторой степени означает выделение элемента как приватного. Я не смог определить точное применяемое правило, так как несколько элементов были в одном файле, а некоторые вложены.
Чтобы устранить такие проблемы, не помечайте подклассы или поля как внутренние, если родительский элемент помечен как внутренний. После этого опыта я бы также предложил организовать по одному элементу на единицу компиляции (как это требуется в Java) вместо того, чтобы помещать большое количество элементов в один файл, поскольку это может создать путаницу такого рода.
Я также хотел бы отметить для кого-то, кого смущают предупреждения Codacy, что некоторые из предложений Codacy невозможно удовлетворить (например, помечать функции на внутреннем интерфейсе как двойные внутренние, что я считаю невозможным - несмотря на то, что такая практика может быть допускается для некоторых комбинаций вложенности элементов).