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):
- Cómo inyectar una actividad en un adaptador usando dagger2
- Dagger: la clase no podría estar enlazada con la clave
- ¿Es posible a los miembros de @Inject (proporcionados a través de @Provides), que contienen un Contexto de Actividad de la Actividad Base
- Adición de clases sin actividad a Dagger 2 Graph Android
- Dagger 2, módulos de biblioteca y @Singleton
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.
- Dagger se puede utilizar para realizar la inyección en un proveedor de contenido?
- ¿Cómo organizas tus módulos y componentes Dagger 2?
- No se puede encontrar la clase de símbolo "Generated" para Dagger 2
- ¿Cómo inyectar dependencias pojo usando dagger 2?
- Dagger2 componente genérico método de inyección
- Utilice los módulos Dagger sin la directiva "inyecta"
- Referencia no resuelta para Dagger 2 en Kotlin
- Java.lang.NoClassDefFound usando Dagger 2 para Android 4
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.
- ¿Por qué necesito envolver un ImageView en un FrameLayout?
- ¿Cómo deshabilitar / habilitar la red, cambiar a Wifi en el emulador de Android?