Кинжал, не генерирующий компоненты для / тестового класса

Я следую за гидом здесь:https://github.com/ecgreb/dagger-2-testing-demo

у меня есть следующая настройка в моем приложении / src / main (инъекция и @Provides код опущен):

public class FlingyApplication extends Application {
    @Singleton
    @Component(modules = { FlingyModule.class })
    public interface FlingyComponent
}

@Module
public class FlingyModule

в приложении / src / test:

public class TestFlingyApplication extends Application {
    @Singleton
    @Component(modules = { TestFlingyModule.class })
    public interface TestFlingyComponent extends FlingyComponent
}

@Module
public class TestFlingyModule

до сих пор он почти идентичен примеру github. Когда dagger идет генерировать код для построителей компонентов в src / main, они генерируют правильно. Однако Dagger не генерирует код для Компонентные строители в src / test.

моя основная сборка.Gradle в:

dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0-alpha3'

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1'
}

мое приложение / сборка.Gradle в

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'


android {
    # There is obviously more in here, but this is the custom part:
    packagingOptions {
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }
}

dependencies {
    compile 'com.squareup:otto:1.3.8'
    compile 'com.android.support:cardview-v7:23.1.1'
    compile 'com.android.support:recyclerview-v7:23.1.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.jakewharton:butterknife:7.0.1'

    compile 'com.google.dagger:dagger:2.0.1'
    apt 'com.google.dagger:dagger-compiler:2.0.1'
    compile 'javax.annotation:javax.annotation-api:1.2'

    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'

    testCompile 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:3.0'
    testCompile 'org.mockito:mockito-core:1.10.19'
}

поэтому, когда я строю, я получаю DaggerFlingyApplication_FlingyComponent класс, но не DaggerTestFlingyApplication_TestFlingyComponent

что-то интересное, я заметил, что если переключить строку:

apt 'com.google.dagger:dagger-compiler:2.0.1'
# TO
compile 'com.google.dagger:dagger-compiler:2.0.1'

Я вижу следующее, Когда я запускаю ./gradlew compileDebugUnitTestSources:

:app:compileDebugJavaWithJavac
Note: /app/build/generated/source/apt/debug/com/jy/flingy/DaggerFlingyApplication_FlingyComponent.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:app:preDebugUnitTestBuild UP-TO-DATE
:app:prepareDebugUnitTestDependencies
:app:compileDebugUnitTestJavaWithJavac
Note: /app/build/intermediates/classes/test/debug/com/jy/flingy/DaggerTestFlingyApplication_TestFlingyComponent.java uses unchecked or unsafe operations.

Я не знаю, почему он строит для промежуточных звеньев, и я предполагаю, что мне нужна сборка.файл gradle для использования apt вместо compile, но я не могу понять, как заставить это работать. Я знаю, что это абсолютно возможно.

6 ответов


вам нужно добавить следующее к вашему build.gradle файл для измерительного оборудования:

androidTestApt 'com.google.dagger:dagger-compiler:<version>'

или для теста JUnit:

testApt 'com.google.dagger:dagger-compiler:<version>'

это необходимо для создания кода Dagger для компонентов теста.


редактировать:

если вы используете jack цепочка инструментов затем добавить следующее для теста андроида:

androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

для тестов JUnit:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

редактировать:

In если вы используете kotlin-kapt для кода Котлина используйте следующее:

kaptAndroidTest 'com.google.dagger:dagger-compiler:<version>'

или для теста JUnit:

kaptTest 'com.google.dagger:dagger-compiler:<version>'

Регистрация этой ссылке для получения дополнительной информации.


просто добавить немного к приведенному выше ответу, так как были некоторые недавние изменения.

от Android Gradle плагин версии 2.2 и выше вас больше не будет использовать testApt.

поэтому с этого момента вам нужно поместить только это в сборку.Gradle в:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

но более того, то, зачем я пришел сюда, заключается в следующем:если вам нужно gradle для создания классов DaggerComponent для вас вам придется сделать немного дополнительную работа.

открыть нашу сборку.gradle файл и после раздела android напишите следующее:

android.applicationVariants.all { variant ->
    if (variant.buildType.name == "debug") {
        def aptOutputDir = new File(buildDir, "generated/source/apt/${variant.unitTestVariant.dirName}")
        variant.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir)
        assembleDebug.finalizedBy('assembleDebugUnitTest')
    }
}

это создаст каталог build/generated/source/apt/ test / в качестве получателя классов Java, и последняя часть запустит задачу "assembleDebugUnitTest", которая, наконец, создаст эти компоненты Dagger2 в только что созданной папке.

обратите внимание, что этот скрипт только запускается для варианта "debug" и использует этот вариант сборки, используя задача "assembleDebug". Если по какой-то причине вам это нужно в других вариантах, просто немного подправьте это.

почему Dagger2 не делает этого автоматически, вне меня, но эй, я не профессионал.


для Android Studio 3 и dagger 2.13 необходимы уже упомянутые процессоры аннотаций:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13'

но также не забудьте сделать это для инструментального теста под androidTest:

androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13'

у вас может сложиться впечатление, что это само по себе не работает, потому что классы DaggerXYZ не генерируются. Через несколько часов я узнал, что генерация тестового источника запускается только при выполнении тестов. Если вы начнете test или androidTest из Android Studio генерация источника должна быть триггерной.

Если вам нужен этот более ранний триггер gradle вручную:

gradlew <moduledirectory>:compile<Flavor>DebugAndroidTestSources
gradlew <moduledirectory>:compile<Flavor>DebugTestSources

заменить Debug если вы запускаете тест в другом типе сборки.

Примечание:

если вы используете multiDexEnable = true, вы можете получить сообщение об ошибке:

не удалось выполнить тест: не удалось выполнить инструментирование из-за 'Ява.ленг.IncompatibleClassChangeError'

использовать другой бегун в этом случае:

android {

  defaultConfig {
    multiDexEnabled true
    testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"

Если вы добавили kaptAndroidTest для зависимостей dagger и все еще не получаете тестовые компоненты при перестроении проекта, попробуйте запустить assembleAndroidTest.


Если вы используете kotlin используйте"kaptAndroidTest " для создания компонента dagger для тестов android в вашей сборке.файл gradle.


добавление к вышеуказанному решению и добавление testKapt и androidTestKapt для dagger, у меня была проблема, что мои модули и компоненты имели неправильный импорт в результате отсутствия импорта

Эл.г

 import android.support.test.espresso.core.deps.dagger.Module
 import android.support.test.espresso.core.deps.dagger.Module

вместо

import dagger.Module
import dagger.Provides

надеюсь, что это помогает