ここでガイドに従っています: 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ファイルが必要だと思いますが、どうやって取得するのかわからないこれが機能します。私はそれが絶対に可能であることを知っています。
インストルメンテーションテスト用に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 リンクを確認してください。
いくつかの最近の変更があったため、上記の答えに少しだけ追加します。
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がこれを自動的に行わない理由は私を超えていますが、ちょっと、私はプロではありません。
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"
短剣の依存関係にkaptAndroidTestを追加しても、プロジェクトの再構築時にテストコンポーネントが取得されない場合は、assembleAndroidTestを実行してみてください。
上記のソリューションに追加し、短剣用の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
お役に立てれば
こんにちは、すべてのgradleの依存関係と注釈を追加した後でもまだ機能しない場合は、このためにassembleAndroidTest gradleスクリプトを実行する必要があります。空のテストケースを作成して実行するだけです。それはあなたのために仕事をします。乾杯
Kotlinを使用している場合は、build-gradleファイルでAndroidテスト用の短剣コンポーネントを生成するために "kaptAndroidTest"を使用します。