【问题标题】:Java annotation processor - Annotated Kotlin classes unit testsJava 注释处理器 - 带注释的 Kotlin 类单元测试
【发布时间】:2017-05-22 13:26:50
【问题描述】:

我有一个注释处理器 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 最近才涉足注释处理,也许我是第一个遇到这个问题的人?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      旧问题,但 kotlin-compile-testing 现在可用并广泛用于此用途。它也支持 java 和 kotlin 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        相关资源
        最近更新 更多