Dagger没有为/ test class生成组件

jya*_*nks 59 android dagger-2

我在这里关注指南: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
Run Code Online (Sandbox Code Playgroud)

在app/src/test中:

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

@Module
public class TestFlingyModule
Run Code Online (Sandbox Code Playgroud)

到目前为止,它几乎与示例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'
}
Run Code Online (Sandbox Code Playgroud)

我的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'
}
Run Code Online (Sandbox Code Playgroud)

因此,当我建立时,我得到了DaggerFlingyApplication_FlingyComponent课程,但不是DaggerTestFlingyApplication_TestFlingyComponent

我注意到有趣的是,如果我切换线:

apt 'com.google.dagger:dagger-compiler:2.0.1'
# TO
compile 'com.google.dagger:dagger-compiler:2.0.1'
Run Code Online (Sandbox Code Playgroud)

我跑的时候看到以下内容./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.
Run Code Online (Sandbox Code Playgroud)

我不知道它为什么建立中间体,我认为我需要使用build.gradle文件apt而不是compile,但我似乎无法弄清楚如何让它工作.我知道这绝对是可能的.

Abd*_*lah 121

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

androidTestApt 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

或者用于JUnit测试:

testApt 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

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


编辑:

如果您正在使用jack工具链,请为android测试添加以下内容:

androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

对于JUnit测试:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您使用的kotlin-kapt是Kotlin代码,请使用以下命令:

kaptAndroidTest 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

或者用于JUnit测试:

kaptTest 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

请查看链接以获取更多信息.

  • 记得执行测试或运行`assembleAndroidTest`来实际看到依赖类`DaggerMyComponent`已解决,只需`rebuild`就不会从dagger生成类. (17认同)
  • 我不得不将apt升级到1.7 + ...```classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'```以使testApt工作 (5认同)
  • 我得到以下内容:```错误:(55,0)未找到Gradle DSL方法:'testApt()'``` (4认同)
  • 我试过这个变种"testAnnotationProcessor"但是没有生成类.你知道这种方法有什么问题吗? (3认同)

Car*_*ves 27

只是为上述答案添加一点,因为最近有一些变化.

从Android Gradle插件2.2及更高版本开始,您将不再使用testApt.

所以从现在开始,你只需要在build.gradle中添加:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>'
Run Code Online (Sandbox Code Playgroud)

但更重要的是,我来到这里的是:如果您需要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')
    }
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,此脚本仅针对"debug"变体触发,并使用"assembleDebug"任务利用该构建变体.如果由于某种原因你需要在其他变体中,只需稍微调整一下.

为什么Dagger2不会自动执行此操作超出我的范围,但是,嘿,我不是专业人士.


k_o*_*_o_ 25

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

testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13'
Run Code Online (Sandbox Code Playgroud)

但也不要忘记为仪表化测试做到这一点androidTest:

androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13'
Run Code Online (Sandbox Code Playgroud)

您可能会觉得仅此一项不起作用,因为未生成DaggerXYZ类.几个小时后,我发现只有在执行测试时才会触发测试源生成.如果您启动testandroidTest从Android Studio 启动,则应触发源生成.

如果您手动需要此早期触发器gradle:

gradlew <moduledirectory>:compile<Flavor>DebugAndroidTestSources
gradlew <moduledirectory>:compile<Flavor>DebugTestSources
Run Code Online (Sandbox Code Playgroud)

Debug如果在其他构建类型中运行test,请替换.

注意:

如果您使用multiDexEnable = true,则可能会收到错误消息:

测试运行失败:由于'java.lang.IncompatibleClassChangeError'导致仪表运行失败

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

android {

  defaultConfig {
    multiDexEnabled true
    testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
Run Code Online (Sandbox Code Playgroud)

  • 是的,您需要运行一些测试,然后 Dagger 将生成测试 dagger 类(组件)+1 (3认同)

Mur*_*rat 9

如果您为匕首依赖项添加了kaptAndroidTest,并且在重建项目时仍未获得测试组件,请尝试运行assembleAndroidTest。