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_FlingyComponent
Klasse, 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ß apt
statt compile
, aber ich kann nicht scheinen , um herauszufinden , wie diese zur Arbeit zu kommen. Ich weiß, dass es absolut möglich ist.
Antworten:
build.gradle
Fü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
jack
verwenden, 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-kapt
Kotlin-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.
quelle
Error:(55, 0) Gradle DSL method not found: 'testApt()'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
damit testApt funktioniertassembleAndroidTest
, um zu sehen, ob die Abhängigkeitsklasse tatsächlichDaggerMyComponent
aufgelöst wurde.rebuild
Die Klassen werden einfach nicht aus dem Dolch generiert.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
test
oderandroidTest
von 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,
Debug
wenn Sie einen Test in einem anderen Build-Typ ausführen.Hinweis:
Wenn Sie multiDexEnable = true verwenden, wird möglicherweise folgende Fehlermeldung angezeigt:
Verwenden Sie in diesem Fall einen anderen Läufer:
android { defaultConfig { multiDexEnabled true testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
quelle
rebuild
das über das gesamte Projekt geht, aber offensichtlich nicht. Danke, Mann.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.
quelle
}
testApt
, war dies der Trick. Vielen Dank!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.
quelle
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
quelle
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
quelle
Wenn Sie kotlin verwenden, verwenden Sie " kaptAndroidTest ", um eine Dolchkomponente für Android-Tests in Ihrer build.gradle-Datei zu generieren.
quelle
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.quelle