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

Rob*_*key 5 java junit unit-testing annotation-processing 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)
Run Code Online (Sandbox Code Playgroud)

问题很明显,正在使用不正确的编译器.当我的文件扩展名不是'.java'时,抛出异常本身.如果我尝试使用'.java'文件扩展名加载Kotlin类,则它不起作用,因为它不是正确的Java语法.

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

由于Kotlin最近刚刚涉足注释处理,或许我是第一个遇到这个问题的人?

use*_*723 2

Kotlin 通过生成“存根”(空类框架,与目标 Kotlin 类具有相同的语义/方法/字段)来与普通 Java 注释处理器集成[1]。这意味着,使用kapt\xe2\x80\x94 对 Java 注释处理器进行单元测试基本上是不可能的,即使您以某种方式将 Kotlin 工具集成到测试流程中,您最终也会测试kapt自身,而不是您自己的代码。

\n\n

如果您想确保您的注释处理代码可以与 Kotlin 生成的存根配合使用,只需生成存根生成器可能生成的所有可能的不变量,并将它们用作测试主题,就像任何普通 Java 代码一样。

\n