Не обнаружен тестовый компонент с кинжалом 2

Я надеюсь, что это просто то, что я делаю неправильно здесь. Я пытаюсь использовать Dagger 2.0 для инъекций зависимостей для моих тестов JUnit (а не тестов Espresso , просто чистых JUnit). Итак, у меня есть «главный» java-модуль и «тестовый» Java-модуль. В основном модуле у меня есть Dagger Module и компонент:

@Module public class MainModule { @Provides public Widget provideWidget() { return new ConcreteWidget(); } } ... @Component (modules = MainModule.class) public interface MainComponent { void inject(WidgetConsumer consumer); } 

И в моем тестовом модуле у меня есть следующее:

 @Module public class TestModule { @Provides public Widget provideWidget() { return new Widget() { @Override public void doThing() { int y = 6; y ++; } }; } } ... @Component(modules = TestModule.class) public interface TestComponent extends MainComponent{ } 

У моего build.gradle есть зависимости, которые выглядят так:

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' compile 'com.google.dagger:dagger:2.9' testCompile 'com.google.dagger:dagger:2.9' annotationProcessor 'com.google.dagger:dagger-compiler:2.9' testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9' } 

По какой-то причине кинжал генерирует DaggerMainComponent , но отказывается генерировать DaggerTestComponent . Кажется, что нет ошибок в выходе градиента при построении.

Вот что … Я думаю, что обработчик аннотации запущен, но каким-то образом плагин android gradle не смог вытащить эти сгенерированные источники во время компиляции. Я проверил каталог app / build / generated / source / apt / test / и нашел там DaggerTestComponent.java , но по какой-то причине он не импортируется как зависимость.

Есть предположения? Вот ссылка на тестовый проект, показывающий мою проблему

Solutions Collecting From Web of "Не обнаружен тестовый компонент с кинжалом 2"

Добавьте это в build.gradle после android DSL:

 android { ... } android.applicationVariants.all { def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}") it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir) } 

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

Для Kotlin заменить generated/source/apt/... generated/source/kapt/...

В этом треке возникает проблема, связанная с этим.

Я нашел обходное решение, на всякий случай кто-то застрянет в этом вопросе в будущем. Похоже, что команда testAnnotationProcessor в плагине android gradle не работает для тестовых модулей (возможно, ошибка в их реализации?). Таким образом, вы можете написать testAnnotationProcessor и ваш build.gradle будет компилироваться, но, похоже, он не работает должным образом.

Обходной путь заключается в том, чтобы вернуться к старшему плагину обработки аннотаций сторонних разработчиков Hugo Visser (android-apt).

Чтобы сделать это, добавьте следующие значения в свои зависимости buildscript в свой основной файл build.gradle:

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0-rc1' // ADD THIS LINE HERE vvv classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } } 

Затем в build.gradle вашего отдельного модуля добавьте следующую строку вверху:

 apply plugin: 'com.android.library' // ADD THIS LINE HERE vvv apply plugin: 'com.neenbedankt.android-apt' 

Наконец, вместо использования testAnnotationProcessor и annotationProcessor просто используйте apt и testApt :

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.google.dagger:dagger:2.9' // USE apt INSTEAD OF annotationProcessor HERE vvv apt 'com.google.dagger:dagger-compiler:2.9' testCompile 'com.google.dagger:dagger:2.9' // USE testApt INSTEAD OF testAnnotationProcessor HERE vvv testApt 'com.google.dagger:dagger-compiler:2.9' testCompile 'junit:junit:4.12' } 

Обратите внимание, что вы должны использовать версию android-apt версии 1.8, поскольку версия 1.4 не поставляется с командой / функцией testApt / whatever.

В зависимости от типа вашего теста:

  • вставьте testAnnotationProcessor "com.google.dagger:dagger-compiler:2.x" внутренние зависимости от вашего файла build.gradle для src/test

или

  • Вставить androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x" внутренние зависимости от вашего файла build.gradle для src/androidTest