Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java注释处理器-带注释的Kotlin类单元测试_Java_Unit Testing_Junit_Kotlin_Annotation Processing - Fatal编程技术网

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

Java注释处理器-带注释的Kotlin类单元测试,java,unit-testing,junit,kotlin,annotation-processing,Java,Unit Testing,Junit,Kotlin,Annotation Processing,我有一个注释处理器,我想为Kotlin工作,但是我在单元测试方面遇到了一个障碍。如果有人能给我一些建议,我将不胜感激 我当前的单元测试实现使用Google的库。我创建输入和输出类并将它们存储在resources目录中。然后在单元测试期间,编译测试库编译输入java类,执行注释处理器,然后将生成的类与资源目录中的预期输出类进行比较 以下是我所指的一个例子(来自我的项目): 这对于我当前所有基于java的单元测试都非常有效。但是,当我尝试使用Kotlin类编写一些测试时,我的测试无法加载该类 我相

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

我当前的单元测试实现使用Google的库。我创建输入和输出类并将它们存储在resources目录中。然后在单元测试期间,编译测试库编译输入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语法不正确

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


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

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

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