Dolch erzeugt keine Komponenten für / Testklasse

71

Ich folge der Anleitung hier: https://github.com/ecgreb/dagger-2-testing-demo

Ich habe das folgende Setup in meiner App / src / main (die Injektion und der @ Provides-Code wurden weggelassen):

public class FlingyApplication extends Application {
    @Singleton
    @Component(modules = { FlingyModule.class })
    public interface FlingyComponent
}

@Module
public class FlingyModule

In app / src / test:

public class TestFlingyApplication extends Application {
    @Singleton
    @Component(modules = { TestFlingyModule.class })
    public interface TestFlingyComponent extends FlingyComponent
}

@Module
public class TestFlingyModule

Bisher ist es fast identisch mit dem Beispiel Github. Wenn Dolch den Code für die Komponenten-Builder in src / main generiert, werden sie ordnungsgemäß generiert. Dagger generiert jedoch keinen Code für die Component Builder in src / test.

Mein Haupt-Build.gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0-alpha3'

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1'
}

Meine App / 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'
}

Wenn ich baue, bekomme ich die DaggerFlingyApplication_FlingyComponentKlasse, aber nicht dieDaggerTestFlingyApplication_TestFlingyComponent

Etwas Interessantes ist mir aufgefallen, wenn ich die Leitung wechsle:

apt 'com.google.dagger:dagger-compiler:2.0.1'
# TO
compile 'com.google.dagger:dagger-compiler:2.0.1'

Ich sehe Folgendes, wenn ich renne ./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.

Ich weiß nicht , warum es auf Intermediates baut und ich nehme an, dass ich die build.gradle Datei verwenden muß aptstatt compile, aber ich kann nicht scheinen , um herauszufinden , wie diese zur Arbeit zu kommen. Ich weiß, dass es absolut möglich ist.

jyanks
quelle
Diese Dokumentation ( google.github.io/dagger/testing.html ) rät, Dolch nicht für Unit-Tests zu verwenden ..
Kishan B
Wenn Sie viele Abhängigkeiten haben, kann dies darauf hinweisen, dass Ihre Komponententests mehr als eine einzelne Einheit testen. Das heißt, Google weiß es nicht immer am besten (keuchen!) Und das ist eine ziemlich breite Aussage von ihnen. Die Verwendung von Dolchen in Unit-Tests in bestimmten Fällen funktioniert gut für uns, daher diese Frage.
Jyanks

Antworten:

136

build.gradleFür den Instrumentierungstest müssen Sie Ihrer Datei Folgendes hinzufügen :

androidTestApt 'com.google.dagger:dagger-compiler:<version>'

oder für den JUnit-Test:

testApt 'com.google.dagger:dagger-compiler:<version>'

Dies ist erforderlich, um Dolchcode für Ihre Testkomponenten zu generieren.


EDIT :

Wenn Sie eine Toolkette jackverwenden, fügen Sie für den Android-Test Folgendes hinzu:

androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

für JUnit-Tests:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

EDIT :

Wenn Sie kotlin-kaptKotlin-Code verwenden, verwenden Sie Folgendes:

kaptAndroidTest 'com.google.dagger:dagger-compiler:<version>'

oder für den JUnit-Test:

kaptTest 'com.google.dagger:dagger-compiler:<version>'

Überprüfen Sie diesen Link für weitere Informationen.

Abdullah
quelle
4
Ich bekomme folgendes:Error:(55, 0) Gradle DSL method not found: 'testApt()'
Jyanks
5
Ich musste apt auf 1.7 + aktualisieren ... classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'damit testApt funktioniert
jyanks
3
Ich habe es mit dieser Variante "testAnnotationProcessor" versucht, aber die Klasse wird nicht generiert. Wissen Sie, ob es bei diesem Ansatz Probleme gibt?
Leandro Ocampo
1
Die Jack-Prozessorabhängigkeiten funktionieren nicht mit Prozessoren im Verzeichnis / test. Ich habe zu apt gewechselt und es funktioniert gut. Wenn Sie diese Funktionalität benötigen, lassen Sie Jack hinter sich und verwenden Sie apt.
Jason Robinson
26
Denken Sie daran, die Tests auszuführen oder auszuführen assembleAndroidTest, um zu sehen, ob die Abhängigkeitsklasse tatsächlich DaggerMyComponentaufgelöst wurde. rebuildDie Klassen werden einfach nicht aus dem Dolch generiert.
Jamesbluecrow
29

Für Android Studio 3 und Dolch 2.13 werden die bereits erwähnten Anmerkungsprozessoren benötigt:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13'

Vergessen Sie aber auch nicht, dies für den instrumentierten Test unter androidTest:

androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13'

Möglicherweise haben Sie den Eindruck, dass dies allein nicht funktioniert, da die DaggerXYZ-Klassen nicht generiert werden. Nach Stunden stellte ich fest, dass die Testquellengenerierung nur ausgelöst wird, wenn die Tests ausgeführt werden. Wenn Sie ein testoder androidTestvon Android Studio aus starten, sollte die Quellgenerierung ausgelöst werden.

Wenn Sie diesen früheren Trigger-Gradle manuell benötigen:

gradlew <moduledirectory>:compile<Flavor>DebugAndroidTestSources
gradlew <moduledirectory>:compile<Flavor>DebugTestSources

Ersetzen, Debugwenn Sie einen Test in einem anderen Build-Typ ausführen.

Hinweis:

Wenn Sie multiDexEnable = true verwenden, wird möglicherweise folgende Fehlermeldung angezeigt:

Testlauf fehlgeschlagen: Instrumentierungslauf fehlgeschlagen aufgrund von 'java.lang.IncompatibleClassChangeError'

Verwenden Sie in diesem Fall einen anderen Läufer:

android {

  defaultConfig {
    multiDexEnabled true
    testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
k_o_
quelle
3
Ja, Sie müssen einige der Tests ausführen, und dann generiert Dagger die
Testdolchklassen
Ich habe immer gedacht, dass rebuilddas über das gesamte Projekt geht, aber offensichtlich nicht. Danke, Mann.
Viacheslav
28

Nur um die obige Antwort ein wenig zu ergänzen, da in letzter Zeit einige Änderungen vorgenommen wurden.

Ab Android Gradle Plugin Version 2.2 und höher wird testApt nicht mehr verwendet .

Von nun an müssen Sie nur noch Folgendes in das build.gradle einfügen:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'

Aber darüber hinaus bin ich hierher gekommen: Wenn Sie gradle benötigen, um die DaggerComponent-Klassen für Sie zu generieren , müssen Sie ein wenig zusätzliche Arbeit leisten.

Öffnen Sie unsere build.gradle-Datei und schreiben Sie NACH dem Android-Abschnitt Folgendes:

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

Dadurch wird das Verzeichnis build / generate / source / apt / test / als Empfänger einer Java-Klasse erstellt, und im letzten Teil wird die Aufgabe "assembleDebugUnitTest" ausgelöst, mit der die Dagger2-Komponenten in dem gerade erstellten Ordner erstellt werden.

Beachten Sie, dass dieses Skript nur für die "Debug" -Variante ausgelöst wird und diese Build-Variante mithilfe der "assembleDebug" -Task nutzt. Wenn Sie es aus irgendeinem Grund in anderen Varianten benötigen, optimieren Sie es einfach ein wenig.

Warum Dagger2 dies nicht automatisch tut, ist mir ein Rätsel, aber hey, ich bin kein Profi.

CarlosGoncalves
quelle
Funktioniert für mich, Sie haben das Ende verpasst}
Efi MK
Ich mochte diesen Ansatz, weil für die Installation keine weiteren Android-Bibliotheken erforderlich sind. Da ich TDD in einer separaten Bibliothek mache, begann ich mit android.libraryVariants.all
Juan Mendez
1
Fantastisch. Nachdem man stundenlang nach einer Alternative zu gesucht hatte testApt, war dies der Trick. Vielen Dank!
Saltandpepper
@saltandpepper Haben Sie Probleme mit der neuesten Version von gradle?
Shishir Shetty
Vielen Dank. Ich habe 2 Tage gebraucht, um das Problem zu beheben. Kotlin + Dolch 2.19 + letzter Gradle
Andrii Kovalchuk
16

Wenn Sie kaptAndroidTest für Dolchabhängigkeiten hinzugefügt haben und beim erneuten Erstellen Ihres Projekts immer noch keine Testkomponenten erhalten, führen Sie assembleAndroidTest aus.

Murat
quelle
1
Ich empfehle diese Antwort, weil es Ihnen hilft zu sehen, ob etwas mit Ihrem Abhängigkeitsdiagramm oder anderen Dingen aus Abhängigkeiten nicht
stimmt
Du hast meinen Tag gerettet, Bruder, ich war lange in dieser Ausgabe gefangen.
Rizwan
1

Beim Hinzufügen zu der obigen Lösung und Hinzufügen von testKapt und androidTestKapt für Dolch hatte ich das Problem, dass meine Module und Komponenten aufgrund fehlender Importe die falschen Importe hatten

z.B

 import android.support.test.espresso.core.deps.dagger.Module
 import android.support.test.espresso.core.deps.dagger.Module

Anstatt von

import dagger.Module
import dagger.Provides

Hoffe das hilft

Youssefhassan
quelle
1
Zuerst habe ich diesen Vorschlag übersprungen, weil ich sicher war, dass es unmöglich das Problem sein könnte, aber nachdem ich weitere 20 Minuten mit dem Debuggen verbracht hatte, ging ich tatsächlich hin und überprüfte die Importe. Und siehe da, Android Studio hatte die Espresso-Versionen aus irgendeinem Grund automatisch importiert.
Nicholas
1

Hallo, auch nachdem alle Gradle-Abhängigkeiten und Anmerkungen hinzugefügt wurden, wenn dies immer noch nicht funktioniert, müssen Sie das assembleAndroidTest-Gradle-Skript ausführen. Erstellen Sie einfach einen leeren Testfall und führen Sie ihn aus. Es wird den Job für Sie erledigen. Prost

Ehtisham Shami
quelle
0

Wenn Sie kotlin verwenden, verwenden Sie " kaptAndroidTest ", um eine Dolchkomponente für Android-Tests in Ihrer build.gradle-Datei zu generieren.

Dalvinder Singh
quelle
0

Ich bin ./gradlew buildüber die Befehlszeile gelaufen und habe Informationen zu einer fehlenden Provides-Methode erhalten, von der Android Studio mir nichts erzählt hat.

elliptisch1
quelle