Java 注释处理器 - 带注释的 Kotlin 类 单元测试

Java annotation processor - Annotated Kotlin classes unit tests

我有一个注释处理器 library,我想为 Kotlin 工作,但是我在单元测试方面遇到了障碍。如果有人能给我一些建议,我将不胜感激。

我当前的单元测试实现使用 Google 的 compile-testing 库。我创建输入和输出 classes 并将它们存储在资源目录中。然后在单元测试期间,编译测试库编译输入 java class,执行注释处理器,然后将生成的 classes 与预期输出 class 进行比较资源目录。

这是我所指的示例(来自我的项目): Unit test class Resources (Input and expected output classes

这对我当前所有基于 java 的单元测试都非常有用。但是,当我尝试使用 Kotlin classes 编写一些测试时,我的测试无法加载 class.

我认为这是因为编译测试库首先是一个 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”时,会抛出异常本身。如果我尝试加载带有“.java”文件扩展名的 Kotlin class,它不会工作,因为它不正确 Java 语法。

有没有人遇到过这个问题并解决了?我看过一些其他的注解处理器(例如DBFlow),他们不以这种方式编写单元测试。

由于Kotlin最近才涉足注解处理,可能我是第一个遇到这个问题的吧?

Kotlin 通过生成 "stubs"(空 class 骨架,与目标 Kotlin class 具有相同的 semantic/methods/fields 与普通 Java 注释处理器集成[1]。这意味着,使用 kapt 对 Java 注释处理器进行单元测试基本上是不可能的——即使你以某种方式将 Kotlin 工具集成到你的测试流程中,你最终也会测试 kapt 本身,而不是然后是你自己的代码。

如果你想确保你的注解处理代码与 Kotlin 生成的存根一起工作,只需生成存根生成器可能产生的所有可能的不变量,并像任何普通的一样将它们用作测试对象 Java代码。

旧问题,但 kotlin-compile-testing 现在可用并广泛用于此用途。它也支持 java 和 kotlin 文件。