2017-03-14 3 views
9

Ich hoffe, dass dies nur etwas ist, das ich hier falsch mache. Ich versuche, Dolch 2.0 zu verwenden, um Abhängigkeiten für meine JUnit-Tests zu injizieren (nicht Espresso-Tests, nur reine JUnit). Also, ich habe ein "Main" Java Modul und ein "Test" Java Modul. Im Hauptmodul, habe ich einen Dolch Modul bekam und eine Komponente:Dolch 2 generiert Testkomponente nicht erkannt

@Module 
public class MainModule { 
    @Provides 
    public Widget provideWidget() { 
     return new ConcreteWidget(); 
    } 
} 

... 

@Component (modules = MainModule.class) 
public interface MainComponent { 
    void inject(WidgetConsumer consumer); 
} 

Und in meinem Testmodul, habe ich folgendes:

@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{ 
} 

Meine build.gradle hat Abhängigkeiten, die wie folgt aussehen dies:

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

Aus welchem ​​Grund auch immer, Dolch erzeugt DaggerMainComponent, weigert sich aber, DaggerTestComponent zu erzeugen. Es scheint keine Fehler in der Graustufenausgabe zu geben, wenn ich baue.

Hier ist die Sache ... Ich denke, der Annotationsprozessor läuft, aber irgendwie kann das Android-Gradle-Plugin diese generierten Quellen während der Kompilierzeit nicht erfassen. Ich habe das Verzeichnis app/build/generated/source/apt/test/inspiziert und dort DaggerTestComponent.java gefunden, aber aus irgendeinem Grund wird es nicht als Abhängigkeit importiert.

Irgendwelche Gedanken? Here is a link to a test project showing my issue

+0

Bitte senden Sie ein Testprojekt wenn möglich. – azizbekian

+0

Sicher Sache. Bearbeitete meine Antwort, um einen Link zu einem Testprojekt hinzuzufügen. – Alex

Antwort

15

dies nach android DSL build.gradle hinzufügen:

android { 
    ... 
} 

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

Danach würden Ihre Testkomponenten erkannt werden.

Für Kotlin ersetzen generated/source/apt/... mit generated/source/kapt/...

ist es an issue raised im Tracker diese über.

+0

Danke für die Problemumgehung, aber ich habe Probleme damit. Kann ich irgendwo die DSL-Syntax prüfen? Es sagt mir, dass 'applicationVariants' nicht in android existiert. Ich habe das Gefühl, dass sie es entweder umbenannt haben, es losgeworden sind oder es woanders hingebracht haben. 'android.buildTypes' und' android.sourceSets' existieren, aber 'android.applicationVariants' scheint nicht (mit Gradle Plugin v 2.3.0-rc1). – Alex

+0

Ich habe gerade eine Änderung in dem von Ihnen bereitgestellten Quellcode vorgenommen. Ich habe nur diese drei Zeilen nach 'android {}' in 'build.gradle' hinzugefügt. Hör zu. – azizbekian

+0

Ja, ich habe genau das versucht (nach dem Android-Block). Ich bekomme "konnte keine unbekannte Eigenschaft 'applicationVariants' für Objekt vom Typ com.android.build.gradle.LibraryExtension." Ah! Ich denke, ich weiß, was mein Problem ist ... Ich benutze 'apply plugin: 'com.android.library'' an der Spitze. Entschuldigung, ich habe hier ein Beispielprojekt gepostet und versuche, dieses Update auf mein aktuelles Projekt anzuwenden, das ein Android-Bibliotheksprojekt (AAR) ist. Ich wette, Bibliotheken haben keine Varianten oder so etwas. Wie sieht das für ein Bibliotheksprojekt aus, weißt du? – Alex

5

Ich habe einen Workaround gefunden, nur für den Fall, dass jemand mit diesem Problem in der Zukunft stecken bleibt. Es scheint, dass der testAnnotationProcessor Befehl im Android-Gradle-Plugin nicht für Testmodule funktioniert (möglicherweise ein Bug in ihrer Implementierung?). So können Sie schreiben testAnnotationProcessor und Ihre build.gradle wird kompilieren, aber es scheint nicht richtig zu funktionieren.

Die Problemumgehung besteht darin, auf das ältere Drittanbieter-Annotationsverarbeitungs-Plug-in von Hugo Visser (android-apt) zurückzugreifen.

, das zu tun, fügen Sie den folgenden Code zu Ihrer buildscript Abhängigkeit in der Haupt build.gradle:

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

Dann in Ihrem build.gradle des einzelnen Moduls die folgende Zeile an der Spitze hinzu:

apply plugin: 'com.android.library' 

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

Schließlich statt testAnnotationProcessor und annotationProcessor zu verwenden, verwenden nur apt und 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' 
} 

Beachten Sie, dass Sie die Version 1.8 von Android-Apt verwenden müssen, da die Version 1.4 nicht mit dem testApt Befehl/Funktion/was auch immer geliefert wird.

0

Je nach Testtyp:

  • Einsatz testAnnotationProcessor "com.google.dagger:dagger-compiler:2.x" innerhalb Abhängigkeiten auf Ihrer build.gradle Datei für src/test

oder

  • Einsatz androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x" innerhalb Abhängigkeiten auf Ihrem build.gradle Datei für src/androidTest