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

5

我有一个注解处理器,我希望它能够在Kotlin中运行,但是我在单元测试方面遇到了一些问题。如果有人能给我一些建议,我将不胜感激。

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

以下是我参考的项目示例: 单元测试类 资源(输入和预期输出类)

对于我所有当前的基于Java的单元测试,这个方法都非常有效。然而,当我尝试使用Kotlin类编写一些测试时,我的测试无法加载该类。

我相信这是由于 compile-testing 库首先是一个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最近才涉足注解处理,也许我是第一个遇到这个问题的人?
2个回答

2
Kotlin与普通的Java注解处理器集成,通过生成“存根”(空类骨架,具有与目标Kotlin类相同的语义/方法/字段)[1]。这意味着,使用kapt对Java注解处理器进行单元测试基本上是不可能的——即使你以某种方式将Kotlin工具集成到测试流程中,最终你将测试的是kapt本身,而不是你自己的代码。
如果您想确保您的注解处理代码可以与Kotlin生成的存根一起使用,请生成可能由存根生成器产生的所有可能的不变量,并像任何普通的Java代码一样使用它们作为测试主题。

0

虽然这是一个老问题,但现在已经有kotlin-compile-testing可用并广泛用于此用途。它支持Java和Kotlin文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接