web-dev-qa-db-fra.com

Dague ne générant pas de composants pour/classe de test

Je suis le guide ici: https://github.com/ecgreb/dagger-2-testing-demo

J'ai la configuration suivante dans mon application/src/main (l'injection et le code @Provides omis):

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

@Module
public class FlingyModule

Dans app/src/test:

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

@Module
public class TestFlingyModule

Jusqu'ici, il est presque identique à l'exemple github. Lorsque poignard va générer le code pour les générateurs de composants dans src/main, ils génèrent correctement. Dagger ne génère toutefois pas de code pour les générateurs de composants dans src/test.

Mon build.gradle principal:

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

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

Mon application/build.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'
}

Donc, quand je construis, je reçois la classe DaggerFlingyApplication_FlingyComponent, mais pas le DaggerTestFlingyApplication_TestFlingyComponent

Une chose intéressante que j'ai remarquée est que si je change de ligne:

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

Je vois ce qui suit quand je lance ./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.

Je ne sais pas pourquoi cela passe aux intermédiaires et je suppose que le fichier build.gradle doit utiliser apt au lieu de compile, mais je n'arrive pas à comprendre comment le faire fonctionner. Je sais que c'est absolument possible.

53
jyanks

Vous devez ajouter ce qui suit dans votre fichier build.gradle pour le test d'instrumentation:

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

ou pour le test JUnit:

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

Cela est nécessaire pour générer du code Dagger pour vos composants de test.


MODIFIER:

Si vous utilisez la chaîne d'outils jack, ajoutez ensuite le test .__ pour Android:

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

pour les tests JUnit:

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

MODIFIER:

Si vous utilisez kotlin-kapt pour le code Kotlin, utilisez ce qui suit:

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

ou pour le test JUnit:

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

Vérifiez this link pour plus d’informations.

101
Abdullah

Juste pour ajouter un peu à la réponse ci-dessus, car il y a eu des changements récents.

À partir de la version 2.2 et plus récente du plug-in Android Gradle, vous n'utiliserez plus testApt .

Donc, à partir de maintenant, vous ne devez mettre que ceci dans le build.gradle:

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

Mais plus que cela, ce que je suis venu ici, est le suivant: si vous avez besoin de Gradle pour générer les classes DaggerComponent pour vous vous devrez faire un peu plus de travail.

Ouvrez notre fichier build.gradle et APRES la section Android, écrivez ceci:

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')
    }
}

Cela créera le répertoire build/généré/source/apt/test/en tant que destinataire des classes Java et la dernière partie déclenchera la tâche "assembleDebugUnitTest" qui créera finalement ces composants Dagger2 dans le dossier qui vient d'être créé.

Notez que ce script est en cours de déclenchement pour la variante "debug" et tire parti de cette variante de construction à l'aide de la tâche "assembleDebug". Si, pour une raison quelconque, vous en avez besoin dans d'autres variantes, ajustez-le un peu.

Pourquoi Dagger2 ne le fait pas automatiquement me dépasse, mais bon, je ne suis pas un pro.

23
CarlosGoncalves

Pour Android Studio 3 et Dagger 2.13, les processeurs d'annotation déjà mentionnés sont nécessaires: 

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

Mais aussi, n’oubliez pas de le faire pour le test instrumenté sous androidTest:

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

Vous pouvez avoir l'impression que cela seul ne fonctionne pas, car les classes DaggerXYZ ne sont pas générées. Après des heures, j'ai découvert que la génération de la source de test n'est déclenchée que lorsque les tests sont exécutés. Si vous démarrez une test ou androidTest à partir d'Android Studio, la génération de source doit être un déclencheur.

Si vous avez besoin de ce niveau de déclenchement antérieur manuellement:

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

Remplacez Debug si vous exécutez test dans un type de construction différent.

Remarque:

Si vous utilisez multiDexEnable = true, vous pourriez recevoir une erreur:

Échec du test: L'exécution de l'instrumentation a échoué à cause de 'Java.lang.IncompatibleClassChangeError'

Utilisez un autre coureur dans ce cas:

Android {

  defaultConfig {
    multiDexEnabled true
    testInstrumentationRunner "com.Android.test.runner.MultiDexTestRunner"
22
k_o_

Si vous avez ajouté kaptAndroidTest pour les dépendances du poignard et que vous ne récupérez toujours pas les composants de test lors de la reconstruction de votre projet, essayez de lancer assembleAndroidTest.

2
Murat

Bonjour, même après avoir ajouté tous les dépendenices et annotations de gradle, si cela ne fonctionne toujours pas, vous devez exécuter le script de dégradé assembleAndroidTest pour cela. Créez simplement un scénario de test vide et exécutez-le. Cela fera le travail pour vous. À votre santé

0
Ehtisham Shami

En ajoutant à la solution ci-dessus et en ajoutant les testsKapt et androidTestKapt pour poignard, j'ai eu le problème que mes modules et composants avaient les importations incorrectes en raison d'importations manquantes 

par exemple 

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

au lieu de 

import dagger.Module
import dagger.Provides

J'espère que cela t'aides

0
youssefhassan

Si vous utilisez kotlin, utilisez " kaptAndroidTest " pour générer le composant dague pour les tests Android dans votre fichier build.gradle.

0
Dalvinder Singh