2017-03-14 13 views
9

私はこれがちょうど私がここで間違っていると思っています。私は私のJUnitテスト(エスプレッソテストではない、純粋なJUnit)の依存関係を注入するためにDagger 2.0を使用しようとしています。だから、私は 'メイン' Javaモジュールと 'テスト' 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

android DSL後build.gradleにこれを追加します。

android { 
    ... 
} 

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

はその後、あなたのテストコンポーネントが認識されます。

Kotlinの場合、この関係トラッカーで generated/source/kapt/...

ありan issue raisedgenerated/source/apt/...を交換してください。テストの種類に応じて

+0

回避策をお寄せいただきありがとうございますが、問題があります。どこにDSL構文を調べることができますか?これは、 'applicationVariants'がアンドロイドに存在しないことを私に伝えています。名前を変更したり、取り除いたり、別の場所に移動したりしたという気持ちがあります。 'android.buildTypes'と' android.sourceSets'は存在しますが、 'android.applicationVariants'はそうではありません(gradleプラグインv 2.3.0-rc1)。 – Alex

+0

あなたが提供したソースコードに変更を加えました。 'build.gradle'で' android {} 'の後に3行だけ追加しました。見てみな。 – azizbekian

+0

ええ、私はちょうどそれを(アンドロイドブロックの後に)試みました。私は "com.android.build.gradle.LibraryExtension型のオブジェクトに対して未知のプロパティ 'applicationVariants'を取得できませんでした。"ああ!私は私の問題が何であるか知っていると思います...私は 'apply plugin: 'com.android.library''を先頭に使用しています。申し訳ありませんが、私はここにサンプルプロジェクトを投稿し、この修正をアンドロイドライブラリ(AAR)プロジェクトである実際のプロジェクトに適用しようとしています。私はライブラリにバリエーションや何かがないと確信しています。これはどのようにライブラリプロジェクトを探すでしょうか? – Alex

5

今後この問題が発生した場合に備えて、回避策が見つかりました。アンドロイド・グラデル・プラグインの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.4版にはtestAptコマンド/機能/何でも付属していないので、1.8版のandroid-aptを使用する必要があることに注意してください。

0

  • あなたのbuild.gradleのandroidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"内部の依存関係を挿入src/test

または

  • のためにあなたのbuild.gradleファイルにtestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"内部の依存関係を挿入ファイル名src/androidTest
関連する問題