Unit testing 如何在Java/Kotlin中包含注释处理器生成的代码来测试类路径
我有一个Android项目正在从Java迁移到Kotlin。在这个项目中,我有一个纯Kotlin模块,在其中我使用以下build.gradle实现一个API客户端:Unit testing 如何在Java/Kotlin中包含注释处理器生成的代码来测试类路径,unit-testing,junit,kotlin,dagger,kapt,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 "c
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以注入依赖项。我很难把它完成
在build.gradle的帮助下,我已经在一个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项目的示例: 在我看来,使用生成的类的测试源在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')
}
}
可以肯定的是,您的意思是生成的文件中的声明对测试源不可见吗?我不明白你所说的“未包含在类路径中”是什么意思,为什么你需要它呢?热键就是这样。也许我找不到合适的词语来表达自己。我需要生成的DaggerUnitTestComponent类在我的测试类上可见。为了更好地理解这个问题,我编辑了这个问题。看一看我在试图重现这个问题时创建的一个示例项目:(这是一个稍微修改过的项目),它似乎对我很好。我认为,如果你能提供更多关于你的项目的细节,或者制作一个简单的示例项目来说明出了什么问题,这会有所帮助。嘿,@hotkey。你的帮助非常有用。为了补充您的回答,我必须将源代码从Java移动到Kotlin源代码集:从
src/main/Java
到src/main/Kotlin
,从src/test/Java
到src/test/Kotlin
。有了这个并应用Idea插件,我有了解决方案。谢谢@hugonardo很高兴我能帮忙。