如何在 Java/Kotlin 中包含注释处理器生成的代码以测试类路径
How to include a Annotation Processor generated code to test classpath in Java/Kotlin
我有一个 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 项目中成功完成了这种事情,并将以下代码片段添加到 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')
}
}
我有一个 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.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')
}
}