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

时间:2017-03-14 18:10:39

标签: java android junit android-gradle dagger-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,但出于某种原因,它并未作为依赖项导入。

有什么想法? Here is a link to a test project showing my issue

3 个答案:

答案 0 :(得分:18)

build.gradle DSL:

之后将其添加到android
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/...

跟踪器中有an issue raised

答案 1 :(得分:5)

我找到了一个解决方法,以防将来有人遇到这个问题。看来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'

最后,不要使用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。

答案 2 :(得分:0)

取决于您的测试类型:

  • testAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"
  • 的build.gradle文件的依赖项中插入src/test

  • androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"
  • 的build.gradle文件的依赖项中插入src/androidTest