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

时间:2017-01-08 01:22:57

标签: java unit-testing junit kotlin annotation-processing

我有一个注释处理器library,我想为Kotlin工作,但是我在单元测试方面遇到了麻烦。如果有人能给我一些建议,我真的很感激。

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

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

这对我目前所有基于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最近刚刚涉足注释处理,或许我是第一个遇到这个问题的人?

1 个答案:

答案 0 :(得分:2)

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

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