Dagger 2 generó el componente de prueba no reconocido
Espero que esto sea algo que estoy haciendo mal aquí. Estoy tratando de usar Dagger 2.0 para inyectar dependencias para mis pruebas de JUnit ( no pruebas de Espresso , solo puro JUnit). Por lo tanto, tengo un módulo "principal" java y un módulo de java "prueba". En el módulo principal, tengo un Dagger Module y un Component:
@Module public class MainModule { @Provides public Widget provideWidget() { return new ConcreteWidget(); } } ... @Component (modules = MainModule.class) public interface MainComponent { void inject(WidgetConsumer consumer); }
Y en mi módulo de prueba, tengo lo siguiente:
- Pruebas parametrizadas de instrumentación en Android
- Experimental JUnit apoyo en Android + Kotlin no funciona
- Unidad de prueba SparseArray utilizando JUnit (utilizando JVM)
- Se ha producido un error en la ejecución de la prueba: La ejecución de la instrumentación ha fallado debido a que "Proceso se ha estropeado". Al probar varias actividades de Android
- Android TestRunner falla debido a la excepción de IllegalState
@Module public class TestModule { @Provides public Widget provideWidget() { return new Widget() { @Override public void doThing() { int y = 6; y ++; } }; } } ... @Component(modules = TestModule.class) public interface TestComponent extends MainComponent{ }
Mi build.gradle tiene dependencias que se parecen a esto:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' compile 'com.google.dagger:dagger:2.9' testCompile 'com.google.dagger:dagger:2.9' annotationProcessor 'com.google.dagger:dagger-compiler:2.9' testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9' }
Por cualquier razón, Dagger genera DaggerMainComponent
, pero se niega a generar DaggerTestComponent
. Parece que no hay errores en la salida gradle cuando construyo.
Aquí está la cosa … Creo que el procesador de anotación está funcionando, pero de alguna manera el complemento androide gradle es no poder tirar en las fuentes generadas durante la compilación. He inspeccionado el directorio app / build / generated / source / apt / test / y DaggerTestComponent.java
encontrado DaggerTestComponent.java
allí, pero por alguna razón, no se importa como una dependencia.
¿Alguna idea? Aquí hay un enlace a un proyecto de prueba que muestra mi problema
- ¿Existe alguna manera de usar junit.extensions.TestSetup para pruebas en Android?
- Agrupación de pruebas roboeléctricas utilizando junit Category en un proyecto gradle de Android
- Prueba de Android Realm con RxJava - "abierto desde un hilo sin un Looper" Excepción
- ¿Cómo puedo saber si mi aplicación se ejecuta con Robolectric?
- Servicio Android no lanzado por JUnit test
- NullPointerException en la reflexión durante el arranque de Robolectric - cualquier sugerencias?
- ¿Cómo ejecutar una prueba JUnit4 simple en Android Studio 1.1?
- VerifyError con PowerMock en Android
Añadir esto a build.gradle
después de android
DSL:
android { ... } android.applicationVariants.all { def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}") it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir) }
A partir de entonces, su componente de prueba será reconocido.
Hay un problema planteado en el rastreador en relación con esto.
He encontrado una solución, por si alguien se queda con este problema en el futuro. Parece que el comando testAnnotationProcessor
en el complemento androide gradle no funciona para los módulos de prueba (posiblemente un error en su implementación?). Así que usted puede escribir testAnnotationProcessor
y su build.gradle compilará, pero parece que no funciona correctamente.
La solución es recurrir al antiguo complemento de procesamiento de anotaciones de terceros por Hugo Visser (android-apt).
Para ello, añada lo siguiente a sus dependencias de buildscript en su build.gradle principal:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0-rc1' // ADD THIS LINE HERE vvv classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }
A continuación, en el build.gradle de su módulo individual, agregue la siguiente línea en la parte superior:
apply plugin: 'com.android.library' // ADD THIS LINE HERE vvv apply plugin: 'com.neenbedankt.android-apt'
Por último, en lugar de usar testAnnotationProcessor
y annotationProcessor
, sólo tiene que usar apt
y testApt
:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.google.dagger:dagger:2.9' // USE apt INSTEAD OF annotationProcessor HERE vvv apt 'com.google.dagger:dagger-compiler:2.9' testCompile 'com.google.dagger:dagger:2.9' // USE testApt INSTEAD OF testAnnotationProcessor HERE vvv testApt 'com.google.dagger:dagger-compiler:2.9' testCompile 'junit:junit:4.12' }
Tenga en cuenta que debe utilizar la versión 1.8 de android-apt, ya que la versión 1.4 no se suministra con el comando testApt
/ function / whatever.
- ¿Por qué no se llama a onBackPressed ()?
- Problemas con ContactsContract.CommonDataKinds.StructuredName