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.