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:

 @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

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.

  • Java.lang.NoClassDefFoundError: prueba androide y junit
  • Prueba de unidad Android: connectedAndroidTest no ejecuta mi caso de prueba
  • Robolectric + PowerMock + Mockito no funciona
  • Casos de prueba de Android que fallan después de actualizar a Java 8 y herramientas de compilación versión 25
  • Android JUnit: Cómo hacer que una excepción cause un caso de prueba para pasar (anotación @Test)
  • VerifyError con Mockito 1.9.5 y DexMaker-Mockito-1.0
  • qué prueba de unidad, en aplicaciones Android
  • Android - Excepción fatal: junit.framework.AssertionFailedError en WebViewCore
  • Prueba de unidad Actividad.startService () llamada?
  • ¿Cómo puedo ejecutar el código en el hilo de la interfaz de usuario en una prueba de Android JUnit sin una actividad?
  • Android: genera una intención simulada y devuelve algunos datos de intenciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.