2016-03-26 8 views
41

コンポーネントを生成していない私はここにガイドを次しています:ダガー用/テストクラス

public class FlingyApplication extends Application { 
    @Singleton 
    @Component(modules = { FlingyModule.class }) 
    public interface FlingyComponent 
} 

@Module 
public class FlingyModule 
https://github.com/ecgreb/dagger-2-testing-demo

を、私は私のアプリ/ srcに/メイン(射出と@Providesコードは省略)で、次のセットアップを持っていますアプリ/ SRC /試験で

public class TestFlingyApplication extends Application { 
    @Singleton 
    @Component(modules = { TestFlingyModule.class }) 
    public interface TestFlingyComponent extends FlingyComponent 
} 

@Module 
public class TestFlingyModule 

はこれまでのところ、それは、例えば、githubのとほぼ同じです。 daggerがsrc/mainにComponent Builderのコードを生成すると、それらは正しく生成されます。ただし、Daggerはsrc/testのComponent Builderのコードを生成しません。

私の主なbuild.gradle:

dependencies { 
    classpath 'com.android.tools.build:gradle:2.1.0-alpha3' 

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.5.1' 
} 

マイアプリ/ build.gradle

apply plugin: 'com.android.application' 
apply plugin: 'com.neenbedankt.android-apt' 


android { 
    # There is obviously more in here, but this is the custom part: 
    packagingOptions { 
     exclude 'META-INF/services/javax.annotation.processing.Processor' 
    } 
} 

dependencies { 
    compile 'com.squareup:otto:1.3.8' 
    compile 'com.android.support:cardview-v7:23.1.1' 
    compile 'com.android.support:recyclerview-v7:23.1.1' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.android.support:design:23.1.1' 
    compile 'com.squareup.picasso:picasso:2.5.2' 
    compile 'com.jakewharton:butterknife:7.0.1' 

    compile 'com.google.dagger:dagger:2.0.1' 
    apt 'com.google.dagger:dagger-compiler:2.0.1' 
    compile 'javax.annotation:javax.annotation-api:1.2' 

    compile 'io.reactivex:rxandroid:1.1.0' 
    compile 'io.reactivex:rxjava:1.1.0' 

    testCompile 'com.neenbedankt.gradle.plugins:android-apt:1.4' 
    testCompile 'junit:junit:4.12' 
    testCompile 'org.robolectric:robolectric:3.0' 
    testCompile 'org.mockito:mockito-core:1.10.19' 
} 

私はビルドするときに、私はDaggerFlingyApplication_FlingyComponentクラスを取得しますが、ないDaggerTestFlingyApplication_TestFlingyComponent

何か私が気づいた面白いのは、私が回線を切り替えると、それは:

apt 'com.google.dagger:dagger-compiler:2.0.1' 
# TO 
compile 'com.google.dagger:dagger-compiler:2.0.1' 
私は ./gradlew compileDebugUnitTestSourcesを実行したとき、私は以下を参照してください。

:app:compileDebugJavaWithJavac 
Note: /app/build/generated/source/apt/debug/com/jy/flingy/DaggerFlingyApplication_FlingyComponent.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
:app:preDebugUnitTestBuild UP-TO-DATE 
:app:prepareDebugUnitTestDependencies 
:app:compileDebugUnitTestJavaWithJavac 
Note: /app/build/intermediates/classes/test/debug/com/jy/flingy/DaggerTestFlingyApplication_TestFlingyComponent.java uses unchecked or unsafe operations. 

私はそれが中間体に構築し、私はaptの代わりcompileを使用するようにbuild.gradleファイルを必要とすることを前提とし、なぜ知っているが、私はありませんこれをどのように動作させるかを理解していないようです。私はそれが絶対に可能であることを知っています。

+0

をHTTP ://google.github.io/dagger/testing.html)ユニットテストのために短剣を使用しないようにアドバイスしてください。 –

+0

多くの依存関係がある場合は、pあなたのユニットのテストは1つのユニット以上のテストをテストします。それは、Googleは常にベスト(気分が良い!)とはそれほど広範な声明ではないと述べた。ユニットテストで短剣を使用すると、特定のケースでうまくいくので、この質問にはうってつけです。 – jyanks

答えて

83

あなたは、計装、テストのためのあなたのbuild.gradleファイルに以下を追加する必要があります。これは、あなたのテストコンポーネントのダガーコードを生成するために必要とされる

testApt 'com.google.dagger:dagger-compiler:<version>' 

androidTestApt 'com.google.dagger:dagger-compiler:<version>' 

またはJUnitテストのため。


EDIT

あなたはjackツールチェーンを使用している場合は、Androidのテストのために を次のように追加:JUnitテストのための

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>' 

EDIT

kaptAndroidTest 'com.google.dagger:dagger-compiler:<version>' 

またはJUnitテスト用:詳細は

kaptTest 'com.google.dagger:dagger-compiler:<version>' 

チェックthisリンクを

あなたが次Kotlinコード用kotlin-kaptを使用している場合。

+0

テストが/ testにあっても/ androidTestではなく? – jyanks

+0

あなたは 'androidTest'にあるべき計器テストを書いています。あなたがJUnitテストを書いているなら、あなたは 'testApt'を使うことができます。 – Abdullah

+4

私は以下を取得します: '' 'エラー:(55、0)DSLメソッドが見つかりません: 'testApt()'' '' – jyanks

16

最近の変更があったため、上記の回答に少し追加してください。

Android Gradleプラグインバージョン2.2以上からはtestAptを使用しなくなります。あなたに今からそう

はbuild.gradleにのみ、これを配置する必要があります。

testAnnotationProcessor 'com.google.dagger:dagger-compiler:<version>' 

しかし、それ以上に、私がここに来たものを、以下の通りです:あなたが生成するのGradleが必要な場合あなたのためのDaggerComponentクラスあなたは少し余分な仕事をする必要があります。

私たちのbuild.gradleファイルを開いて、アンドロイドのセクションでは、これを書いAFTER:

android.applicationVariants.all { variant -> 
    if (variant.buildType.name == "debug") { 
     def aptOutputDir = new File(buildDir, "generated/source/apt/${variant.unitTestVariant.dirName}") 
     variant.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir) 
     assembleDebug.finalizedBy('assembleDebugUnitTest') 
    } 
} 

これは、Javaクラスの受信者と最後の部分れるようにディレクトリbuild /生成/ソース/ aptの/テスト/作成されます。 "assembleDebugUnitTest"タスクを起動して、作成したばかりのフォルダにDagger2コンポーネントを最終的に作成します。

このスクリプトは「デバッグ」バリアントのために起動されているだけで、「assembleDebug」タスクを使用してそのビルドバリアントを利用していることに注意してください。もし何らかの理由で他のバリエーションでそれを必要とするのであれば、ちょっと微調整してください。

Dagger2がこれを自動的に実行しないのは私の外ですが、ねえ、私はプロです。

のAndroid Studioの3と短剣2.13すでに述べたように注釈プロセッサが必要とされているために
+0

私のために働いて、あなたは終わりを逃しました '}' –

+0

私はインストールするためにもっと多くのアンドロイドライブラリを必要としないので、このアプローチが気に入っています。別の図書館でTDDをやっているので、android.libraryVariants.allで始まった。 –

+0

素晴らしい。 'testApt'の代わりに何時間も検索した後、これはトリックでした。ありがとう! – saltandpepper

7

testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13' 

をしかし、またandroidTestの下でインストルメントテストのためにこれを行うのを忘れないでください:

androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13' 

あなたがかもしれませんDaggerXYZクラスが生成されないため、これだけでは機能しないという印象を受けます。数時間後、テストソースの生成は、テストが実行されたときにのみ開始されることが分かりました。 Android StudioからtestまたはandroidTestを起動する場合は、ソースの生成がトリガーになるはずです。

手動でこの先にトリガーのGradleが必要な場合:あなたは別のビルドタイプでテストを実行する場合

gradlew <moduledirectory>:compile<Flavor>DebugAndroidTestSources 
gradlew <moduledirectory>:compile<Flavor>DebugTestSources 

Debugを交換してください。

注:

あなたは真のmultiDexEnable =を使用している場合は、エラーを取得する可能性があります:

Test running failed: Instrumentation run failed due to 'java.lang.IncompatibleClassChangeError'

は、このケースで異なるランナーを使用します(このドキュメント

android { 

    defaultConfig { 
    multiDexEnabled true 
    testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner" 
関連する問題