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

我有一个注释处理器库 ,我想为Kotlin工作,但是我的单元测试遇到了麻烦。 如果有人能给我一些建议,我将不胜感激。

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

这里是我所指的一个例子(从我的项目): 单元测试类 资源(输入和预期的输出类

这对我所有的基于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'时引发异常。 如果我尝试使用'.java'文件扩展名加载Kotlin类,它不起作用,因为它的Java语法不正确。

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

由于Kotlin最近才在注释处理中涉足,也许我是第一个有这个问题的?

Kotlin与普通的Java注释处理器集成在一起,通过生成“stubs”(空类的尸体,与目标Kotlin类具有相同的语义/方法/字段) [1] 。 这意味着使用kapt单元测试的Java注释处理器kapt是不可能的 – 即使您将Kotlin工具集成到测试流程中,您也将最终测试kapt本身,而不是您自己的代码。

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