Daga que no genera componentes para / clase de prueba

Estoy siguiendo la guía aquí: https://github.com/ecgreb/dagger-2-testing-demo

Tengo la siguiente configuración en mi app / src / main (la inyección y el código @Provides omitido):

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

En app / src / test:

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

Hasta ahora, es casi idéntico al ejemplo github. Cuando la daga va a generar el código para los constructores de componentes en src / main, generan correctamente. Sin embargo, Dagger no genera código para los constructores de componentes en src / test.

Mi principal build.gradle:

 dependencies { classpath 'com.android.tools.build:gradle:2.1.0-alpha3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1' } 

Mi aplicación / 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' } 

Así que cuando construyo, obtengo la clase DaggerFlingyApplication_FlingyComponent , pero no la DaggerTestFlingyApplication_TestFlingyComponent

Algo interesante que noté es que si cambio la línea:

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

Veo lo siguiente cuando ejecuto ./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. 

No sé por qué se basa en intermedios y asumo que necesito el archivo build.gradle para usar apt lugar de compile , pero no puedo imaginar cómo conseguir que esto funcione. Sé que es absolutamente posible.

Usted necesita agregar el siguiente a su archivo de build.gradle para la prueba de la instrumentación:

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

O para la prueba JUnit:

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

Esto es necesario para generar el código Dagger para los componentes de prueba.


EDIT :

Si está utilizando la cadena de herramientas jack luego añada seguir para la prueba de Android:

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

Para pruebas JUnit:

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

EDIT :

En caso de que esté utilizando kotlin-kapt para el uso del código Kotlin, kotlin-kapt :

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

O para la prueba JUnit:

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

Consulte este enlace para obtener más información.

Sólo para añadir un poco a la respuesta anterior, ya que ha habido algunos cambios recientes.

Desde Android Gradle plugin versión 2.2 y anteriores ya no usará testApt .

Así que a partir de ahora solo necesitas poner esto en la build.gradle:

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

Pero más que eso, lo que vine aquí para, es el siguiente: si usted necesita gradle para generar las clases DaggerComponent para usted tendrá que hacer un poco de trabajo extra.

Abra nuestro archivo build.gradle y DESPUÉS de la sección android escriba esto:

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

}

Esto creará el directorio build / generated / source / apt / test / como un receptor de clases Java y la última parte activará la tarea "assembleDebugUnitTest" que finalmente creará los componentes Dagger2 en la carpeta que acaba de crearse.

Tenga en cuenta que esta secuencia de comandos sólo está siendo activada para la variante de "depuración" y aprovecha esa variante de construcción utilizando la tarea "assembleDebug". Si por alguna razón lo necesitas en otras variantes, sólo tienes que ajustar un poco.

¿Por qué Dagger2 no hacer esto automáticamente es más allá de mí, pero bueno, no soy profesional.

  • @Injects después de @Produces?
  • Dagger 2: Proporcionar la misma instancia entre múltiples componentes con el mismo alcance en diferentes módulos de biblioteca
  • Alcance de la actividad Dagger2, ¿cuántos módulos / componentes necesito?
  • Dagger2 dagger.android. * Las clases no existen
  • Dagger - clase no tiene miembros inyectables
  • Qué es exactamente la daga y cómo funciona
  • Creación de una aplicación Android Instant con componente de aplicación de Dagger
  • Dagger 2: Inyectar el parámetro introducido por el usuario en el objeto
  • Dagger 2 inyectar parámetros del constructor
  • ¿Se puede hacer una inyección de daga en un método estático?
  • Dagger código que da NoClassDefFoundError en las pruebas de instrumentación de Android, pero funciona en la aplicación normal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.