匕首不生成/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不会自动执行此操作超出了我,但是,嘿,我不是亲。