热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dagger2生成的测试组件未被识别

如何解决《Dagger2生成的测试组件未被识别》经验,为你挑选了2个好方法。

我希望这只是我在这里做错了.我正在尝试使用Dagger 2.0为我的JUnit测试注入依赖项(不是Espresso测试,只是纯JUnit).所以,我有一个'主'java模块和'测试'java模块.在主模块中,我有一个Dagger模块和一个组件:

@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{
}

我的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会产生DaggerMainComponent,但拒绝生成DaggerTestComponent.我构建时,gradle输出中似乎没有错误.

这就是......我认为注释处理器正在运行,但不知何故,android gradle插件无法在编译时拉入这些生成的源.我已经检查了app/build/generated/source/apt/test /目录并DaggerTestComponent.java在那里找到了,但由于某种原因,它并没有作为依赖项导入.

有什么想法吗? 这是一个显示我的问题的测试项目的链接



1> azizbekian..:

将此添加到DSL build.gradle之后android:

android {
    ...
}

android.applicationVariants.all {
    def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}")
    it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir)
}

此后,您的测试组件将被识别.

对于科特林替换generated/source/apt/...generated/source/kapt/...

跟踪器中存在一个问题.


没关系,这是`libraryVariants`.弄清楚了.测试你的修复,它完美地工作,谢谢!不能等到谷歌修复他们的插件,我们真的不应该这样做......

2> Alex..:

我找到了一个解决方法,以防将来有人遇到这个问题.似乎testAnnotationProcessorandroid gradle插件中的命令对测试模块不起作用(可能是它们实现中的错误?).所以你可以编写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'

最后,而不是使用testAnnotationProcessorannotationProcessor,只使用apttestApt:

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

请注意,您必须使用1.8版本的android-apt,因为1.4版本不附带testApt命令/ function/whatever.


它似乎不再起作用了(使用Gradle 3.1.0) - >错误:android-apt插件与Android Gradle插件不兼容.请改用'annotationProcessor'配置.
推荐阅读
author-avatar
林筱杏-HA
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有