2017-03-14 33 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