我有一个注释处理器库,我想为Kotlin工作,但在单元测试方面遇到了障碍。如果有人能给我一些建议,我将不胜感激。
我目前的单元测试实现使用谷歌的编译测试库。我创建输入和输出类,并将它们存储在resources目录中。然后在单元测试期间,编译测试库编译输入的java类,执行注释处理器,然后将生成的类与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"时,会引发异常。如果我尝试加载具有".java"文件扩展名的Kotlin类,它将不起作用,因为它不是正确的java语法。
以前有人遇到过这个问题并解决了吗?我已经看过其他一些注释处理器(如DBFlow),它们不以这种方式编写单元测试。
由于Kotlin最近才涉足注释处理,也许我是第一个遇到这个问题的人?
Kotlin通过生成"stub"(空类外壳,与目标Kotlin类具有相同的语义/方法/字段)与普通Java注释处理器集成[1]。这意味着,使用kapt
对Java注释处理器进行单元测试基本上是不可能的——即使您在测试流中以某种方式集成了Kotlin工具,您最终也会测试kapt
本身,而不是您自己的代码。
如果您想确保您的注释处理代码与Kotlin生成的存根一起工作,只需生成存根生成器可能生成的所有可能的不变量,并像任何普通Java代码一样将其用作测试对象。
老问题,但kotlin编译测试现在可用,并广泛用于此用途。它还支持java和kotlin文件。