Кинжал не создает компоненты для / тестового класса

Я следую руководству здесь: https://github.com/ecgreb/dagger-2-testing-demo

У меня есть следующая настройка в моем приложении / src / main (код инъекции и @Provides опущен):

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

В приложении / src / test:

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

До сих пор он почти идентичен примеру github. Когда кинжал переходит к генерации кода для компоновщиков компонентов в src / main, они генерируются должным образом. Однако кинжал не генерирует код для сборщиков компонентов в src / test.

Моя основная сборка:

 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 , но я не могу понять, как заставить это работать. Я знаю, что это абсолютно возможно.

Solutions Collecting From Web of "Кинжал не создает компоненты для / тестового класса"

Вам нужно добавить следующее в файл build.gradle для контрольно-измерительного теста:

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

Или для теста JUnit:

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

Это необходимо для создания кода кинжала для ваших тестовых компонентов.


EDIT :

Если вы используете цепочку инструментов jack , добавьте следующее для теста на Android:

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

Для тестов JUnit:

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

EDIT :

Если вы используете kotlin-kapt для кода Kotlin, используйте следующую kotlin-kapt :

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

Или для теста JUnit:

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

Проверьте эту ссылку для получения дополнительной информации.

Просто добавим немного к вышеуказанному ответу, так как произошли некоторые недавние изменения.

Из плагина Android Gradle версии 2.2 и выше вы больше не будете использовать testApt .

Итак, теперь вы должны поместить только это в build.gradle:

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

Но более того, для чего я пришел, это следующее: если вам нужна градация для создания классов DaggerComponent для вас, вам придется немного поработать.

Откройте наш файл 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, а последняя часть вызовет задачу «assembleDebugUnitTest», которая, наконец, создаст эти компоненты Dagger2 в только что созданной папке.

Обратите внимание, что этот сценарий только запускается для варианта «отладки» и использует этот вариант сборки, используя задачу «assembleDebug». Если по какой-то причине вам это нужно в других вариантах, просто немного измените это.

Почему Dagger2 не делает это автоматически, выходит за меня, но эй, я не профессионал.