Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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


ИЗМЕНИТЬ

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

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

для тестов JUnit:

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

ИЗМЕНИТЬ

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

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

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

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

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

Ответ 2

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

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

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

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

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

Откройте наш файл build.gradle и ПОСЛЕ раздела андроида:

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 в только что созданной папке.

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

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

Ответ 3

Для Android Studio 3 и dagger 2.13 нужны уже упомянутые процессоры аннотаций:

testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.13'

Но также не androidTest сделать это для инструментального теста под androidTest:

androidTestAnnotationProcessor'com.google.dagger:dagger-compiler:2.13'

Может сложиться впечатление, что это само по себе не работает, потому что классы DaggerXYZ не генерируются. После нескольких часов я обнаружил, что генерация тестового источника запускается только при выполнении тестов. Если вы запускаете test или androidTest Android из Android Studio, генерация исходного кода должна быть запущена.

Если вам нужен этот более ранний вариант запуска 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"

Ответ 4

Если вы добавили kaptAndroidTest для зависимостей кинжала и по-прежнему не получаете тестовые компоненты при перестройке проекта, попробуйте запустить assemblyAndroidTest.

Ответ 5

Добавив к вышеупомянутому решению и добавив 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

Надеюсь это поможет

Ответ 6

Если вы используете kotlin, используйте " kaptAndroidTest " для создания компонента кинжала для тестов Android в вашем файле build.gradle.

Ответ 7

Привет, даже после добавления всех зависимостей и аннотаций gradle, если они все еще не работают, вам нужно запустить скрипт gradle для AssemblyAndroidTest. Просто создайте пустой контрольный пример и запустите его. Это сделает работу за вас. ура