Java Dagger 2生成的测试组件未识别

Java Dagger 2生成的测试组件未识别,java,android,junit,android-gradle-plugin,dagger-2,Java,Android,Junit,Android Gradle Plugin,Dagger 2,我希望这只是我做错了什么。我正试图使用Dagger2.0为我的JUnit测试注入依赖项(不是浓缩咖啡测试,只是纯JUnit)。因此,我有一个“主”java模块和一个“测试”java模块。在主模块中,我有一个匕首模块和一个组件: @Module public class MainModule { @Provides public Widget provideWidget() { return new ConcreteWidget(); } } ... @

我希望这只是我做错了什么。我正试图使用Dagger2.0为我的JUnit测试注入依赖项(不是浓缩咖啡测试,只是纯JUnit)。因此,我有一个“主”java模块和一个“测试”java模块。在主模块中,我有一个匕首模块和一个组件:

@Module
public class MainModule {
    @Provides
    public Widget provideWidget() {
        return new ConcreteWidget();
    }
}

...

@Component (modules = MainModule.class)
public interface MainComponent {
    void inject(WidgetConsumer consumer);
}
在我的测试模块中,我有以下内容:

@Module
public class TestModule {
    @Provides public Widget provideWidget() {
        return new Widget() {
            @Override
            public void doThing() {
                int y = 6;
                y ++;
            }
        };
    }
}

...

@Component(modules = TestModule.class)
public interface TestComponent extends MainComponent{
}
My build.gradle的依赖项如下所示:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'
    testCompile 'junit:junit:4.12'

    compile 'com.google.dagger:dagger:2.9'
    testCompile 'com.google.dagger:dagger:2.9'

    annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
    testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9'
}
无论出于何种原因,Dagger生成
DaggerComponent
,但拒绝生成
DaggerTestComponent
。生成时,gradle输出中似乎没有错误

事情是这样的。。。我认为注释处理器正在运行,但不知何故,android gradle插件未能在编译时引入这些生成的源代码。我检查了app/build/generated/source/apt/test/目录,在其中找到了
DaggerTestComponent.java
,但由于某些原因,它没有作为依赖项导入


有什么想法吗

我找到了一个解决办法,以防将来有人遇到这个问题。android gradle插件中的
testAnnotationProcessor
命令似乎不适用于测试模块(可能是它们的实现中的错误?)。因此,您可以编写
testAnnotationProcessor
,build.gradle将进行编译,但它似乎无法正常工作

解决方法是使用Hugo Visser(android apt)开发的较旧的第三方注释处理插件

为此,请将以下内容添加到主build.gradle中的buildscript依赖项中:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.0-rc1'

        // ADD THIS LINE HERE vvv
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}
然后,在单个模块的build.gradle中,在顶部添加以下行:

apply plugin: 'com.android.library'

// ADD THIS LINE HERE vvv
apply plugin: 'com.neenbedankt.android-apt'
最后,不要使用
testAnnotationProcessor
annotationProcessor
,只需使用
apt
testApt

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'

    compile 'com.google.dagger:dagger:2.9'
    // USE apt INSTEAD OF annotationProcessor HERE vvv
    apt 'com.google.dagger:dagger-compiler:2.9'

    testCompile 'com.google.dagger:dagger:2.9'
    // USE testApt INSTEAD OF testAnnotationProcessor HERE vvv
    testApt 'com.google.dagger:dagger-compiler:2.9'

    testCompile 'junit:junit:4.12'
}

请注意,您必须使用android apt的1.8版本,因为1.4版本不附带
testApt
命令/函数/任何东西。

将此添加到
build.gradle
androidDSL之后:

android {
    ...
}

android.applicationVariants.all {
    def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}")
    it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir)
}
此后,您的测试组件将被识别

对于Kotlin,将
generated/source/apt/..
替换为
generated/source/kapt/..


跟踪器中有与此相关的信息。

取决于您的测试类型:

  • src/test的build.gradle文件的依赖项中插入
    testAnnotationProcessor“com.google.dagger:dagger编译器:2.x”

  • src/androidTest的build.gradle文件的依赖项中插入
    androidTestAnnotationProcessor“com.google.dagger:dagger编译器:2.x”

如果可能,请发布测试项目。当然可以。编辑了我的回复以添加到测试项目的链接。感谢您的解决方案,但我遇到了问题。有什么地方可以检查DSL语法吗?它告诉我,
applicationVariants
在android中不存在。我有一种感觉,他们要么重新命名它,要么把它扔掉,要么把它搬到别的地方
android.buildTypes
android.sourceset
存在,但是
android.applicationVariants
似乎不存在(使用gradle插件v2.3.0-rc1)。我刚刚对您提供的源代码做了一个更改。我只在
build.gradle
中的
android{}
之后添加了这三行。看看吧。是的,我确实试过了(在安卓系统阻塞之后)。我得到“无法为com.android.build.gradle.LibraryExtension类型的对象获取未知属性'applicationVariants'。啊!我想我知道我的问题是什么。。。我正在顶部使用
apply插件:“com.android.library”
。抱歉,我在这里发布了一个示例项目,并试图将此修复应用到我的实际项目中,这是一个android库(AAR)项目。我打赌图书馆没有变体之类的东西。你知道这对于一个图书馆项目来说是什么样的吗?不管怎样,它是
libraryVariants
。我明白了。测试了你的修复程序,效果非常好,谢谢!等不及谷歌修复他们的插件了,我们真的不应该这么做……我用这个来记录我的大脑,已经有几个小时了。终于找到了可行的解决办法。谢谢它似乎不再工作了(使用Gradle 3.1.0)-->错误:android apt插件与android Gradle插件不兼容。请改用“annotationProcessor”配置。