Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在Java/Kotlin中包含注释处理器生成的代码来测试类路径_Unit Testing_Junit_Kotlin_Dagger_Kapt - Fatal编程技术网

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

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

我有一个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以注入依赖项。我很难把它完成

在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很高兴我能帮忙。