匕首不生成/testing类的组件

我在这里遵循指南: https : //github.com/ecgreb/dagger-2-testing-demo

我有我的应用程序/ src / main(注入和@Provides代码省略)下面的设置:

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

在app / src / test中:

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

到目前为止,它与github的例子几乎相同。 当匕首去为src / main中的组件生成器生成代码时,它们会正确生成。 然而,Dagger不会为src / test中的组件构build器生成代码。

我主build.gradle:

 dependencies { classpath 'com.android.tools.build:gradle:2.1.0-alpha3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1' } 

我的应用程序/ 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' } 

所以当我构build时,我得到了DaggerFlingyApplication_FlingyComponent类,而不是DaggerTestFlingyApplication_TestFlingyComponent

我注意到一件有趣的事情,如果我切换线:

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

当我运行./gradlew compileDebugUnitTestSources时,我看到以下./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. 

我不知道为什么它构build中间体,我认为我需要build.gradle文件使用apt而不是compile ,但我似乎无法弄清楚如何得到这个工作。 我知道这是完全可能的。

您需要将以下内容添加到您的build.gradle文件以进行仪器testing:

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

或者对于JUnittesting:

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

这是为您的testing组件生成Dagger代码所必需的。


编辑

如果你正在使用jack工具链,然后添加以下为Androidtesting:

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

对于JUnittesting:

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

编辑

如果你正在使用kotlin-kapt代替Kotlin代码,请使用以下命令:

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

或者对于JUnittesting:

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

检查此链接了解更多信息。

只是添加一点上面的答案,因为有一些最近的变化。

从Android Gradle插件版本2.2及以上,您将不再使用testApt

所以从现在起,你只需要在build.gradle中放置这个:

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

但更重要的是,我来到这里的是: 如果你需要gradle来为你生成DaggerComponent类,你将不得不做一些额外的工作。

打开我们的build.gradle文件,然后在android部分写下:

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

这将创build目录build / generated / source / apt / test /作为Java类的接收者,最后一部分将触发“assembleDebugUnitTest”任务,最终在刚创build的文件夹中创build这些Dagger2组件。

请注意,这个脚本只是触发“debugging”变种,并利用“assembleDebug”任务的构build变种。 如果由于某种原因,你需要在其他变体只是稍微调整一下。

为什么Dagger2不会自动执行此操作超出了我,但是,嘿,我不是亲。