Java-обработчик аннотации – аннотированные тесты классов классов Kotlin

У меня есть библиотека процессоров аннотаций, которые я хотел бы получить для Kotlin, однако я попал в ловушку с точки зрения тестирования моего модуля. Я был бы очень признателен, если бы кто-нибудь мог дать мне совет.

В моем текущем модульном тестировании используется библиотека компиляции Google. Я создаю классы ввода и вывода и сохраняю их в каталоге ресурсов. Затем во время модульного теста библиотека тестирования компиляции компилирует входной класс java, выполняет обработчик аннотации и затем сравнивает сгенерированные классы с ожидаемым классом вывода из каталога ресурсов.

Вот пример (из моего проекта) того, что я имею в виду: Unit test class Resources (Входные и ожидаемые классы вывода

Это отлично работает для всех моих текущих модульных тестов на основе Java. Однако, когда я пытаюсь написать некоторые тесты с использованием классов Kotlin, мой тест не загружает класс.

Я считаю, что это связано с тем, что библиотека тестирования компиляции является, прежде всего, специфичной для Java библиотекой (я не вижу упоминания о Kotlin о своем проекте)

На данный момент у меня возникает следующая проблема:

java.lang.IllegalArgumentException: Compilation unit is not of SOURCE kind: "/C:/dev/gsonpath/gsonpath-compiler/build/resources/test/adapter/auto/field_types/primitives/valid/TestValidPrimitives.kt" at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:137) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107) at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64) at com.google.testing.compile.Compilation.compile(Compilation.java:69) at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:281) 

Проблема довольно очевидна в том, что используется неправильный компилятор. Само исключение возникает, когда расширение файла не является «.java». Если я попытаюсь загрузить класс Kotlin с расширением файла .java, это не сработает, так как это неверный синтаксис Java.

Кто-нибудь сталкивался с этим вопросом раньше и решил его? Я просмотрел несколько других обработчиков аннотаций (например, DBFlow ), и они не записывают модульные тесты таким образом.

Поскольку Котлин только недавно занимается обработкой аннотаций, возможно, я первый, кто столкнулся с этой проблемой?

Kotlin интегрируется с обычными обработчиками аннотаций Java, генерируя «заглушки» (пустые классовые туши, имеющие те же семантические / методы / поля, что и целевые классы Kotlin) [1] . Это означает, что модульные тесты Java-аннотационных процессоров с kapt практически невозможны – даже если вы каким-то образом интегрируете инструмент Kotlin в свой тестовый поток, вы в конечном итоге проверите kapt самостоятельно, а не ваш собственный код.

Если вы хотите убедиться, что ваш код обработки аннотаций работает с котами, генерируемыми Kotlin, просто сгенерируйте все возможные инварианты, которые могут быть созданы генератором-заглушкой, и используйте их в качестве тестовых объектов, таких как любой обычный Java-код.