【问题标题】:How to include a Annotation Processor generated code to test classpath in Java/Kotlin如何包含注释处理器生成的代码来测试 Java/Kotlin 中的类路径
【发布时间】:2018-01-12 13:38:09
【问题描述】:

我有一个 Android 项目正在从 Java 迁移到 Kotlin。在这个项目中,我有一个纯 Kotlin 模块,我在其中使用以下 build.gradle 实现 API 客户端:

apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}"
    implementation "com.squareup.retrofit2:retrofit:${retrofit_version}"
    implementation "com.squareup.retrofit2:converter-gson:${retrofit_version}"
    implementation "com.google.code.gson:gson:${gson_version}"
    implementation "com.squareup.okhttp3:logging-interceptor:${okhttp_version}"

    implementation "io.reactivex.rxjava2:rxjava:${rx_java_version}"
    implementation "io.reactivex.rxjava2:rxkotlin:${rx_kotlin_version}"
    implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:${retrofit2_rxjava2_adapter_version}"

    compileOnly "javax.annotation:jsr250-api:${jsr250_version}"
    implementation "com.google.dagger:dagger:${dagger_version}"
    kapt "com.google.dagger:dagger-compiler:${dagger_version}"

    testImplementation "junit:junit:${junit_version}"
    testImplementation "org.mockito:mockito-core:${mockito_version}"
    testImplementation "org.hamcrest:hamcrest-junit:${hamcrest_version}"
    testImplementation "com.squareup.okhttp3:mockwebserver:${mockwebserver_version}"

    // Dependence injection
    kaptTest "com.google.dagger:dagger-compiler:${dagger_version}"
}

单元测试有一个注解处理器依赖项:

kaptTest "com.google.dagger:dagger-compiler:${dagger_version}"

我可以在 build/generated/source/kapt/test 目录下看到生成的源,但是它们对测试源是不可见的,即无法导入生成的 DaggerUnitTestComponent 来注入依赖,例如。而且我很难完成它。

这种事情我已经在一个Android项目上成功了,借助this StackOverflow answer和以下sn-p添加到build.gradle,但是对于纯Kotlin/Java项目,不适用.

android.applicationVariants.all {
  def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}")
  it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir)
}

可以说我使用的是 Android Studio 3.0.1 和 Kotlin 1.2.10。 Kotlin 库模块的来源位于 src/main/java 和 src/test/java。

【问题讨论】:

  • 只是为了确定,您的意思是生成文件中的声明对测试源不可见吗?我无法理解你所说的“不包含在类路径中”是什么意思,为什么你需要字面意思。
  • @hotkey 完全正确。也许我找不到合适的词来表达自己。我需要生成的 DaggerUnitTestComponent 类在我的测试类中可见。我编辑了这个问题以便更好地理解。
  • 看看我在尝试重现该问题时创建的示例项目:github.com/h0tk3y/kt-dagger-example(这是来自kotlin-examples 的稍微修改的项目)似乎对我来说工作正常。我认为,如果您提供有关您的项目的更多详细信息或制作一个简单的示例项目来显示问题所在,这会有所帮助。

标签: unit-testing junit kotlin dagger kapt


【解决方案1】:

您可能想看一个使用 dagger 的 Kotlin 项目示例:(here)

据我所知,使用生成的类的测试源应该在 Gradle 构建期间编译得很好,但 IDE 可能无法正确选择它们。

尝试在项目中将 Kotlin 更新到较新的版本(1.2.10 应该可以处理这个问题)。如果这没有帮助,请尝试使用上面示例中的 idea 插件,为测试生成的源配置如下:

apply plugin: 'idea'

idea {
    module {
        testSourceDirs += file('build/generated/source/kapt/test')
        generatedSourceDirs += file('build/generated/source/kapt/test')
    }
}

【讨论】:

  • 嘿,@hotkey。您的帮助非常有用。为了补充您的答案,我不得不将源代码从 Java 移动到 Kotlin 源集:从 src/main/javasrc/main/kotlin,从 src/test/javasrc/test/kotlin。有了这个并应用了 Idea 插件,我就有了解决方案。谢谢!
  • @hugonardo 很高兴我能帮上忙。
猜你喜欢
  • 2017-05-22
  • 2017-03-04
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多