匕首未为/ test类生成组件


71

我在这里遵循指南: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几乎相同。当匕首为src / main中的Component构建器生成代码时,它们会正确生成。但是,Dagger不会在src / test中为“组件”构建器生成代码。

我的主要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,但是我似乎无法弄清楚如何使它工作。我知道这是绝对可能的。


本文档(google.github.io/dagger/testing.html)通知:不使用匕首单元测试..
基尚乙

如果您有很多依赖性,那么它可能指向您的单元测试而不是单个单元。也就是说,谷歌并不总是最了解(天哪!),这是他们的一个相当广泛的说法。在特定情况下,在单元测试中使用匕首对我们来说效果很好,因此存在这个问题。
jyanks

Answers:


136

您需要在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-kaptKotlin代码,请使用以下代码:

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

或用于JUnit测试:

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

检查链接以获取更多信息。


4
我得到以下信息:Error:(55, 0) Gradle DSL method not found: 'testApt()'
jyanks

5
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'为了使testApt正常运行,我不得不升级到1.7 + ...
jyanks

3
我尝试使用此变体“ testAnnotationProcessor”,但未生成该类。您知道这种方法是否有问题吗?
Leandro Ocampo

1
Jack处理器依赖项不适用于/ test目录中的处理器。我改用了apt,效果很好。因此,如果您需要此功能,请抛开Jack并使用apt。
杰森·罗宾逊

26
请记住执行测试或运行assembleAndroidTest以实际查看依赖项类已DaggerMyComponent解决,只是rebuild不会从匕首生成类。
jamesbluecrow

29

对于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启动testandroidTest从Android Studio启动,则应触发源代码生成。

如果您需要手动使用此较早的触发器gradle:

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
是的,您需要运行一些测试,然后Dagger将生成测试dagger类(组件)+1
Stoycho Andreev '18

我一直认为这rebuild会贯穿整个项目,但显然不会。谢啦。
Viacheslav

28

只是在上面的答案中添加了一点,因为最近发生了一些变化。

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

请注意,此脚本仅针对“ debug”变体被触发,并通过“ assembleDebug”任务利用了该构建变体。如果由于某些原因您需要在其他变体中使用它,请对其稍作调整。

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


为我工作,您错过了结局}
Efi MK

我喜欢这种方法,因为它不需要安装更多的android库。因为我在单独的库中执行TDD,所以我从android.libraryVariants.all
Juan Mendez于2009年

1
太棒了 在搜寻了几个小时的替代品之后testApt,就成功了。谢谢!
saltandpepper

@saltandpepper您在使用最新版本的gradle时遇到任何问题吗?
Shishir Shetty

谢谢。花了我2天的时间修复它。Kotlin + Dagger 2.19 + last gradle
Andrii Kovalchuk

16

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


1
我推荐这个答案,因为它可以帮助您查看依赖关系图是否存在问题或依赖关系之外的其他问题
Oscar Josue Alvrez

您保存了我的兄弟,我在这个问题上困扰了很长时间。
Rizwan

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

希望这可以帮助


1
起初我跳过了这个建议,因为我确定这可能不是问题,但是在又花了20分钟进行调试之后,我才去检查了导入。瞧,Android Studio出于某种原因自动导入了浓缩咖啡版本
Nicholas

1

您好,即使在添加所有gradle依赖项和注释后,如果仍然无法正常工作,则需要为此运行assembleAndroidTest gradle脚本。只需制作一个空的测试用例并运行它。它将为您完成工作。干杯



0

./gradlew build从命令行运行,并获得有关Android Studio并未告诉我的缺少的Provides方法的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.