1. ホーム
  2. android

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

2023-10-02 06:19:58

質問

こちらのガイドに従っています。 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の例とほぼ同じです。daggerがsrc/mainにあるComponentビルダーのコードを生成しようとすると、きちんと生成されます。しかし、Daggerはsrc/testにあるComponentビルダーのコードを生成しません。

私のメインの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.

なぜ中間までビルドされるのかがわからず、build.gradleファイルを想定して apt の代わりに compile の代わりに、を使うことができるのですが、これをうまく使う方法がわからないようです。絶対に可能だということは分かっているのですが。

どのように解決するのですか?

以下のように build.gradle ファイルに追加する必要があります。

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

またはJUnitのテスト用。

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

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


EDIT :

もし、あなたが jack ツールチェインを使用している場合は、以下を追加します。 を追加してください。

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

JUnitのテスト用。

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


EDIT :

を使用している場合 kotlin-kapt を使用している場合は、次のように記述します。

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

またはJUnitのテスト用。

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

チェック この をご覧ください。