2017-03-14 35 views
9

我希望这只是我在这里做错了。我试图用Dagger 2.0为我的JUnit测试注入依赖项(而不是Espresso测试,只是纯粹的JUnit)。所以,我有一个'main'java模块和一个'test'java模块。在主模块,我有一把匕首模块和组件:匕首2生成的测试组件不被识别

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

无论出于何种原因,匕首产生DaggerMainComponent,但拒绝产生DaggerTestComponent。当我建立时,似乎在gradle输出中没有错误。

这是事情......我认为注释处理器正在运行,但不知何故,android gradle插件无法在编译期间拉入那些生成的源代码。我检查了app/build/generated/source/apt/test /目录,发现里面有DaggerTestComponent.java,但由于某种原因,它没有作为依赖项导入。

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

+0

如果可能,请发布测试项目。 – azizbekian

+0

当然可以。编辑我的回应,添加一个链接到测试项目。 – Alex

回答

15

一下添加到build.gradleandroid DSL:

android { 
    ... 
} 

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

之后,你的测试组件会被认可。

对于科特林与generated/source/kapt/...

an issue raised在关于这一跟踪器更换generated/source/apt/...

+0

感谢您的解决方法,但我遇到了问题。有没有我可以检查DSL语法的地方?它告诉我''applicationVariants'在android中不存在。我有一种感觉,他们要么重新命名它,要么摆脱它,要么将它移到其他地方。 'android.buildTypes'和'android.sourceSets'存在,但'android.applicationVariants'似乎不(用gradle插件v 2.3.0-rc1)。 – Alex

+0

我刚刚对您提供的源代码进行了一次更改。我只在'build.gradle'的'android {}'之后添加了这三行。一探究竟。 – azizbekian

+0

是的,我试过(android块后)。我得到“无法获取com.android.build.gradle.LibraryExtension类型的对象的未知属性'applicationVariants'。”啊!我想我知道我的问题是什么......我在顶部使用'apply plugin:'com.android.library''。对不起,我在这里发布了一个示例项目,并试图将此修复应用于我的实际项目,该项目是一个Android库(AAR)项目。我敢打赌,图书馆没有变体或其他东西。这将如何寻找一个图书馆项目,你知道吗? – Alex

5

我发现了一个解决方法,以防万一任何人在将来遇到这个问题。看来android gradle插件中的testAnnotationProcessor命令不适用于测试模块(可能是它们实现中的错误?)。所以你可以写testAnnotationProcessor,你的build.gradle会编译,但它似乎无法正常工作。

解决方法是回到由Hugo Visser(android-apt)制作的老式第三方注释处理插件。

要做到这一点,添加以下到您的buildscript依赖在你的主要的build.gradle:

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命令/函数/任何内容。

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