如何在Java / Kotlin

时间:2018-01-12 13:38:09

标签: unit-testing junit kotlin dagger kapt

我有一个从Java迁移到Kotlin的Android项目。在这个项目中,我有一个纯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}"
}

单元测试有一个Annotation Processor依赖项:

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

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

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。

1 个答案:

答案 0 :(得分:2)

您可能想看一下使用匕首的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')
    }
}