tag studio log example and android dagger-2

android - studio - Daga no genera componentes para/clase de prueba



tag android studio (6)

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

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

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, se generan correctamente. Sin embargo, Dagger no genera código para los constructores de componentes en src / test.

Mi build.gradle principal:

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

Entonces, 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 compila en intermedios y supongo que necesito el archivo build.gradle para usar apt lugar de compile , pero parece que no puedo entender cómo hacer que esto funcione. Sé que es absolutamente posible.


Agregando a la solución anterior y agregando testKapt y androidTestKapt para dagger, tuve el problema de que mis módulos y componentes tenían las importaciones incorrectas como resultado de las importaciones faltantes

p.ej

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

en vez de

import dagger.Module import dagger.Provides

Espero que esto ayude


Para Android Studio 3 y dagger 2.13 se necesitan los procesadores de anotaciones ya mencionados:

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

Pero tampoco olvide hacer esto para la prueba instrumentada en androidTest :

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

Puede tener la impresión de que esto solo no funciona, porque las clases DaggerXYZ no se generan. Después de horas descubrí que la generación de la fuente de prueba solo se activa cuando se ejecutan las pruebas. Si inicia una test o androidTest desde Android Studio, se debe activar la generación de origen.

Si necesita este disparador anterior, gradle manualmente:

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

Reemplace la Debug si ejecuta una prueba en un tipo de compilación diferente.

Nota:

Si está utilizando multiDexEnable = true, puede obtener un error:

La ejecución de la prueba falló: la ejecución de la instrumentación falló debido a ''java.lang.IncompatibleClassChangeError''

Use un corredor diferente en este caso:

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


Si agregó kaptAndroidTest para dependencias de dagas y aún no obtiene los componentes de prueba al reconstruir su proyecto, intente ejecutar assembleAndroidTest.


Si está utilizando kotlin, use " kaptAndroidTest " para generar un componente de daga para las pruebas de Android en su archivo build.gradle.


Solo para agregar un poco a la respuesta anterior, ya que ha habido algunos cambios recientes.

Desde el complemento Android Gradle versión 2.2 y superior , ya no usará testApt .

Entonces, a partir de ahora, solo debe poner esto en build.gradle:

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

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

Abra nuestro archivo build.gradle y DESPUÉS de la sección de 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 / generate / source / apt / test / como un receptor de clases Java y la última parte activará la tarea "assembleDebugUnitTest" que finalmente creará esos componentes Dagger2 en la carpeta que se acaba de crear.

Tenga en cuenta que este script solo se está activando para la variante "depurar" y aprovecha esa variante de compilación utilizando la tarea "assembleDebug". Si por alguna razón lo necesita en otras variantes, solo modifíquelo un poco.

Por qué Dagger2 no hace esto automáticamente está más allá de mí, pero bueno, no soy un profesional.


build.gradle agregar lo siguiente a su archivo build.gradle para la prueba de 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 sus componentes de prueba.

EDITAR :

Si está utilizando la cadena de herramientas jack , agregue lo siguiente para la prueba de Android:

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

para pruebas JUnit:

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

EDITAR :

En caso de que esté usando kotlin-kapt para el código de Kotlin, use lo siguiente:

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

o para la prueba JUnit:

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

Mira this enlace para más información.