unit-testing - 如何包含注释处理器生成的代码来测试 Java/Kotlin 中的类路径

标签 unit-testing junit kotlin dagger kapt

我有一个 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 以注入(inject)依赖项,例如。而且我很难完成它。

this StackOverflow answer 的帮助下,我已经在一个 Android 项目上成功完成了这种事情。并将以下代码段添加到 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。

最佳答案

您可能想查看一个使用 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')
    }
}

关于unit-testing - 如何包含注释处理器生成的代码来测试 Java/Kotlin 中的类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48227426/

相关文章:

python - 如何使用类型函数为方法编写 python 多语言单元测试?

java - 您如何使用 JUNIT 测试 spring jdbcTemplate?

class - 多参数构造函数的回调

android-studio - 'getView' 不覆盖任何内容

kotlin - Spring WebFlux,提取请求正文

unit-testing - 终端上的Gradle堆栈跟踪

c++ - 返回指向私有(private)成员的指针的公共(public)方法的单元测试

javascript - Jasmine 是否有类似最小起订量的 It.IsAny?

c++ - 验证并验证 NoMoreInteractions 到 gtest

java - 在没有电子邮件实际出去的情况下运行 Junit 电子邮件测试