Componente di prova generato da Dagger 2 non riconosciuto

Spero che questo sia solo qualcosa che sto facendo male qui. Sto cercando di utilizzare Dagger 2.0 per iniettare le dependencies per i miei test JUnit ( non Espresso test , solo JUnit puro). Quindi, ho un module java principale e un module java test. Nel module principale, ho un Modulo Dagger e un Componente:

@Module public class MainModule { @Provides public Widget provideWidget() { return new ConcnetworkingWidget(); } } ... @Component (modules = MainModule.class) public interface MainComponent { void inject(WidgetConsumer consumer); } 

E nel mio module di prova ho il seguente:

  • Come portre ImageView davanti a Button in android 5?
  • Specifiche a nido d'ape e TabHost
  • Cosa deve essere utilizzato, content_main o Activity_main?
  • WebView ridisegna il problema durante il caricamento dei dati
  • Autenticazione Digest in Android utilizzando HttpURLConnection
  • Quando utilizzare un fornitore di contenuti
  •  @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{ } 

    Il mio build.gradle ha dependencies che sembrano così:

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.express:express-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' } 

    Per qualsiasi motivo, Dagger genera DaggerMainComponent , ma rifiuta di generare DaggerTestComponent . Sembra che non ci siano errori nell'output graduale quando costruisco.

    Ecco la cosa … penso che il processre di annotazione sia in esecuzione, ma in qualche modo il plugin di gradiente android non riesce a tirare quelle sorgenti generate durante il tempo di compilazione. Ho esaminato la directory app / build / generated / source / apt / test / e DaggerTestComponent.java trovato DaggerTestComponent.java in esso, ma per qualche motivo non viene importto come dipendenza.

    qualche idea? Ecco un collegamento a un progetto di prova che mostra il mio problema

  • Più InfoWindows Maps Android V2
  • Come scrivere un Android SocketServer per ascoltare su wifi
  • Distriggersre più account in AccountManager
  • Codice di esempio di Android HttpPut
  • Errore: WebView.destroy () chiamato mentre è ancora collegato
  • Android Controllare se c'è WiFi, ma non c'è internet
  • 2 Solutions collect form web for “Componente di prova generato da Dagger 2 non riconosciuto”

    Aggiungi questo a build.gradle dopo android DSL:

     android { ... } android.applicationVariants.all { def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}") it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir) } 

    Successivamente, la componente di prova verrà riconosciuta.

    C'è un problema sollevato nel tracker riguardo a questo.

    Ho trovato una soluzione, nel caso in cui qualcuno si attacchi a questo problema in futuro. Sembra che il command testAnnotationProcessor nel plugin di android gradle non funziona per i moduli di prova (forse un bug nella loro implementazione?). Quindi puoi scrivere testAnnotationProcessor e il tuo build.gradle compilerà ma sembra non funzionare correttamente.

    La soluzione è tornare al vecchio plugin di elaborazione delle annotazioni di terze parti di Hugo Visser (android-apt).

    A tal fine, aggiungere le seguenti dependencies buildscript nel tuo build.gradle principale:

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

    Quindi, nel build.gradle del tuo singolo module, aggiungi la seguente row nella parte superiore:

     apply plugin: 'com.android.library' // ADD THIS LINE HERE vvv apply plugin: 'com.neenbedankt.android-apt' 

    Infine, invece di utilizzare testAnnotationProcessor e annotationProcessor , basta usare apt e testApt :

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.express:express-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' } 

    Si noti che è necessario utilizzare la versione 1.8 di android-apt, in quanto la versione 1.4 non viene testApt con il command / function testApt / qualunque.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.