Как включить код, сгенерированный обработчиком аннотаций, для проверки пути к классам в Java / Kotlin

У меня есть проект Android в процессе миграции с Java на Kotlin. В этом проекте у меня есть чистый модуль Kotlin, в котором я реализую API-клиент со следующим build.gradle:

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 с помощью этот ответ StackOverflow и следующий фрагмент добавлены в 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.


person hugonardo    schedule 12.01.2018    source источник
comment
На всякий случай, вы имеете в виду, что объявления из сгенерированных файлов не видны тестовым источникам? Я не мог понять, что вы имеете в виду под «не включен в путь к классам» и зачем вам это буквально.   -  person hotkey    schedule 12.01.2018
comment
@hotkey точно. Может, я не мог подобрать подходящие слова, чтобы выразить себя. Мне нужно, чтобы сгенерированный класс DaggerUnitTestComponent был виден в моих тестовых классах. Я отредактировал вопрос для лучшего понимания.   -  person hugonardo    schedule 12.01.2018
comment
Взгляните на пример проекта, который я создал, когда пытался воспроизвести проблему: github.com/ h0tk3y / kt-dagger-example (это немного измененный проект из kotlin-examples) Кажется, у меня все работает нормально. Я думаю, что это может помочь, если вы предоставите более подробную информацию о своем проекте или создадите простой пример проекта, который покажет, что идет не так.   -  person hotkey    schedule 12.01.2018


Ответы (1)


Возможно, вы захотите взглянуть на пример проекта 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')
    }
}
person hotkey    schedule 12.01.2018
comment
Привет, @hotkey. Ваша помощь была очень полезной. Чтобы дополнить ваш ответ, мне пришлось переместить исходный код из Java в исходный набор Kotlin: с src/main/java на src/main/kotlin и с src/test/java на src/test/kotlin. С этим и применением плагина Idea у меня было решение. Спасибо! - person hugonardo; 15.01.2018
comment
@hugonardo Рад, что смог помочь. - person hotkey; 16.01.2018