我在这里关注指南:https://github.com/ecgreb/dagger-2-testing-demo
我的app / 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几乎完全相同。当dagger为src / main中的Component构建器生成代码时,它们会正确生成。但是,Dagger不会在src / test中为Component构建器生成代码。
我的主要build.gradle:
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-alpha3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1'
}
我的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'
}
因此,当我构建时,我会获得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
时看到以下内容:
: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.gradle文件来使用apt
而不是compile
,但我似乎无法弄清楚如何让这个工作。我知道这绝对可能。
答案 0 :(得分:109)
您需要在build.gradle
文件中添加以下内容以进行检测测试:
androidTestApt 'com.google.dagger:dagger-compiler:<version>'
或JUnit测试:
testApt 'com.google.dagger:dagger-compiler:<version>'
这是为测试组件生成Dagger代码所必需的。
修改强>:
如果您使用的是jack
工具链,请添加以下内容
对于android测试:
androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'
用于JUnit测试:
testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'
修改强>:
如果您使用kotlin-kapt
用于Kotlin代码,请使用以下命令:
kaptAndroidTest 'com.google.dagger:dagger-compiler:<version>'
或JUnit测试:
kaptTest 'com.google.dagger:dagger-compiler:<version>'
查看this链接了解详情。
答案 1 :(得分:26)
只是为上述答案添加一点,因为最近有一些变化。
从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 / generated / source / apt / test /作为Java类接收者,最后一部分将触发&#34; assembleDebugUnitTest&#34;最终将在刚刚创建的文件夹中创建Dagger2组件的任务。
请注意,此脚本仅针对&#34; debug&#34;触发。变体并使用&#34; assembleDebug&#34;来利用该构建变体。任务。如果出于某种原因你需要在其他变体中进行调整,那就稍微调整一下。
为什么Dagger2不会自动执行此操作超出我的范围,但是嘿,我不是专业人士。
答案 2 :(得分:24)
对于Android Studio 3和dagger 2.13,需要提到的注释处理器:
testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13'
但也不要忘记在androidTest
下的仪器化测试中执行此操作:
androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13'
您可能会觉得仅此一项不起作用,因为未生成DaggerXYZ类。几个小时后,我发现只有在执行测试时才会触发测试源生成。如果您从Android Studio启动test
或androidTest
,则应触发源生成。
如果您需要手动使用此早期触发器:
gradlew <moduledirectory>:compile<Flavor>DebugAndroidTestSources
gradlew <moduledirectory>:compile<Flavor>DebugTestSources
如果您使用其他构建类型运行测试,请替换Debug
。
注意:强>
如果您使用multiDexEnable = true,则可能会收到错误:
测试运行失败:仪表运行失败,原因是 'java.lang.IncompatibleClassChangeError'
在这种情况下使用不同的跑步者:
android {
defaultConfig {
multiDexEnabled true
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
答案 3 :(得分:4)
如果您为匕首依赖项添加了kaptAndroidTest,并且在重建项目时仍未获得测试组件,请尝试运行assembleAndroidTest。
答案 4 :(得分:1)
添加到上述解决方案中,并为dagger添加了testKapt和androidTestKapt,我的问题是由于缺少导入,我的模块和组件的导入错误
例如
import android.support.test.espresso.core.deps.dagger.Module
import android.support.test.espresso.core.deps.dagger.Module
代替
import dagger.Module
import dagger.Provides
希望这会有所帮助
答案 5 :(得分:1)
您好,即使添加了所有gradle依赖项和注释(如果仍然无法正常运行),您也需要为此运行assembleAndroidTest gradle脚本。 只需制作一个空的测试用例并运行它。它将为您完成工作。 干杯
答案 6 :(得分:0)
如果您使用kotlin,请使用“ kaptAndroidTest ”在build.gradle文件中为Android测试生成dagger组件。
答案 7 :(得分:0)
我从命令行运行了./gradlew build
,并获得了有关Android Studio并未告诉我的缺少的Provides方法的信息。