匕首没有为/测试类生成组件

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

我在 app/src/main 中有以下设置(注入和@提供代码被省略) :

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 中的 Component 构建器生成代码时,它们会正确地生成。然而,Dagger 不会为 src/test 中的 Component 构建器生成代码。

我的主要建筑:

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,但我似乎不知道如何让它工作。我知道这是绝对有可能的。

19751 次浏览

为了进行检测测试,您需要在 build.gradle文件中添加以下内容:

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

或 JUnit 测试:

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

这是为测试组件生成 Dagger 代码所必需的。


编辑:

如果您使用 jack工具链,然后添加以下内容 机器人测试:

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

查看 这个链接获取更多信息。

只是增加了一点上述答案,因为有一些最近的变化。

从 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 类的接收者,最后一部分将触发“ Assembly bleDebugUnitTest”任务,该任务将最终在刚刚创建的文件夹中创建那些 Dagger2组件。

请注意,这个脚本只是针对“ debug”变量触发的,并使用“ Assembly bleDebug”任务利用了这个构建变量。如果出于某种原因,你需要它在其他变体只是调整了一点。

为什么《匕首2》不能自动做到这一点,我不明白,但是,嘿,我不是专业的。

对于 Android Studio 3和匕首2.13,需要已经提到的注释处理器:

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

但是也不要忘记在 androidTest的仪器测试中这样做:

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

您可能会得到这样的印象,即单独使用这种方法不起作用,因为不会生成 DaggerXYZ 类。几个小时后,我发现测试源代码生成只有在执行测试时才会被触发。如果从 Android Studio 启动 testandroidTest,则应该触发源代码生成。

如果你需要手动更早的触发级别:

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

如果在不同的生成类型中运行测试,请替换 Debug

注:

如果使用 multiDexEnable = true,可能会得到一个错误:

测试运行失败: 由于 ‘ java.lang. InpatibleClassChangeError’

在这种情况下使用不同的跑步机:

android {


defaultConfig {
multiDexEnabled true
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"

如果您正在使用 kotlin,请在 build.gradle 文件中使用“ KaptAndroidTest”为 android 测试生成匕首组件。

如果您为匕首依赖项添加了 kaptAndroidTest,但是在重新构建项目时仍然没有得到测试组件,请尝试运行 AssembleAndroidTest。

添加到上述解决方案并添加 testKapt 和 androidTestKapt for 匕首,我遇到了这样的问题: 由于缺少导入,我的模块和组件导入错误

例如:

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

而不是

import dagger.Module
import dagger.Provides

希望这个能帮上忙

嗨,即使添加了所有的等级依赖项和注释,如果它仍然不工作,那么您需要为此运行汇编 Android 测试等级脚本。 只要创建一个空的测试用例并运行它,它就会为您完成这项工作。 干杯

我从命令行运行 ./gradlew build,得到了一个缺少的提供方法的信息,Android Studio 没有告诉我这个方法。