web-dev-qa-db-ja.com

ダガーが/ testクラスのコンポーネントを生成しない

ここでガイドに従っています: https://github.com/ecgreb/dagger-2-testing-demo

App/src/mainに次のセットアップがあります(インジェクションと@Providesコードは省略されています):

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

@Module
public class FlingyModule

App/src/test内:

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

@Module
public class TestFlingyModule

これまでのところ、例のgithubとほぼ同じです。短剣がsrc/mainのコンポーネントビルダーのコードを生成する場合、適切に生成されます。ただし、Daggerはsrc/testのコンポーネントビルダーのコードを生成しません。

私のメインの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ファイルが必要だと思いますが、どうやって取得するのかわからないこれが機能します。私はそれが絶対に可能であることを知っています。

58
jyanks

インストルメンテーションテスト用にbuild.gradleファイルに以下を追加する必要があります。

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

またはJUnitテストの場合:

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

これは、テストコンポーネントのDaggerコードを生成するために必要です。


[〜#〜] edit [〜#〜]

jackツールチェーンを使用している場合は、Androidテスト用に以下を追加します。

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

jUnitテストの場合:

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

[〜#〜] edit [〜#〜]

Kotlinコードにkotlin-kaptを使用している場合は、次を使用します。

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

またはJUnitテストの場合:

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

詳細については、 this リンクを確認してください。

116
Abdullah

いくつかの最近の変更があったため、上記の答えに少しだけ追加します。

From Android Gradleプラグインバージョン2.2以降はtestAptを使用しなくなります。

したがって、今後はbuild.gradleにこれだけを入れる必要があります。

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

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

Build.gradleファイルを開き、Androidセクションの後にこれを記述します。

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

これにより、ディレクトリbuild/generated/source/apt/test /がJavaクラス受信者として作成され、最後の部分がフォルダー内のDagger2コンポーネントを最終的に作成する「assembleDebugUnitTest」タスクをトリガーします。作成されたばかりです。

このスクリプトは「debug」バリアントに対してのみトリガーされ、「assembleDebug」タスクを使用してそのビルドバリアントを利用することに注意してください。何らかの理由で他のバリアントで必要な場合は、少し調整してください。

Dagger2がこれを自動的に行わない理由は私を超えていますが、ちょっと、私はプロではありません。

27
CarlosGoncalves

Android Studio 3およびdagger 2.13の場合、前述のアノテーションプロセッサが必要です。

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 = trueを使用している場合、エラーが発生する可能性があります。

テストの実行に失敗しました:「Java.lang.IncompatibleClassChangeError」が原因でインストルメンテーションの実行に失敗しました

この場合、別のランナーを使用します。

Android {

  defaultConfig {
    multiDexEnabled true
    testInstrumentationRunner "com.Android.test.runner.MultiDexTestRunner"
25
k_o_

短剣の依存関係にkaptAndroidTestを追加しても、プロジェクトの再構築時にテストコンポーネントが取得されない場合は、assembleAndroidTestを実行してみてください。

7
Murat

上記のソリューションに追加し、短剣用のtestKaptとandroidTestKaptを追加すると、インポートが見つからないためにモジュールとコンポーネントに誤ったインポートがあるという問題がありました

例えば

 import Android.support.test.espresso.core.deps.dagger.Module
 import Android.support.test.espresso.core.deps.dagger.Module

の代わりに

import dagger.Module
import dagger.Provides

お役に立てれば

1
youssefhassan

こんにちは、すべてのgradleの依存関係と注釈を追加した後でもまだ機能しない場合は、このためにassembleAndroidTest gradleスクリプトを実行する必要があります。空のテストケースを作成して実行するだけです。それはあなたのために仕事をします。乾杯

0
Ehtisham Shami

Kotlinを使用している場合は、build-gradleファイルでAndroidテスト用の短剣コンポーネントを生成するために "kaptAndroidTest"を使用します。

0
Dalvinder Singh