Ошибка установки кинжала для тестов эспрессо, компонент не сгенерирован и другие ошибки

Я настраиваю Dagger для использования в тестах эспрессо. Цель состоит в том, чтобы использовать подкласс приложения Application Класс и построить сгенерированный компонент Dagger, который содержит модули, которые обеспечивают фиктивные зависимости.

Давайте начнем с текущего кода:

EspressoTestApplication.java

/**
 * Test application, used for Espresso tests only. This injects it's own mock values.
 */
public class EspressoTestApplication extends FooApp {

    @Nullable
    @Override
    public AppComponent buildApplicationComponent() {
        // Note that `DaggerEspressoTestApplicationComponent` here appears to not be generated
        // as the class is marked red in Android Studio.
        return DaggerEspressoTestApplicationComponent.builder()
                .application(this)
                .build();
}

EspressoTestApplicationComponent.java

/**
 * Dagger component to inject into espresso tests.
 * 
 * The modules listed here are the same as used in the real app.
 * I believe this is were test implementations of these modules (such as TestRetrofitModule)
 * would be placed.
 */
@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        com.foo.dependencyinjection.ActivityBuilder.class,
        OKHTTPClientHelperModule.class,
        RetrofitModule.class})
public interface EspressoTestApplicationComponent extends AppComponent {

}

AppComponent.java (компонент, используемый в реальном приложении)

@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        com.foo.dependencyinjection.ActivityBuilder.class,
        OKHTTPClientHelperModule.class,
        RetrofitModule.class})
public interface AppComponent {

  void inject(com.foo.dependencyinjection.FooApp app);

  @Component.Builder
  interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();

  }
}

EspressoTestRunner.java

/**
 * The Espresso test runner.
 */
public class EspressoTestRunner extends AndroidJUnitRunner {

    @Override
    public Application newApplication(ClassLoader cl, String className, Context context) throws
            InstantiationException, IllegalAccessException, ClassNotFoundException {
        return super.newApplication(cl, EspressoTestApplication.class.getName(), context);
    }
}

build.gradle

android {
    compileSdkVersion 26
    defaultConfig {
        //...

        testInstrumentationRunner 'com.foo.di.EspressoTestRunner'
    }
}
dependencies {
    // ...
    // Dagger (version is 2.14.1)
    implementation "com.google.dagger:dagger:$rootProject.dagger2Version"
    annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version"
    testAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version"
    androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version"
    annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.dagger2Version"
    implementation "com.google.dagger:dagger-android-support:$rootProject.dagger2Version"
}

Ниже приведены ошибки, которые отображаются при попытке запуска:

/foo/app/src/androidTest/java/com/foo/EspressoTestApplication.java:8: error: cannot find symbol
import com.foo.di.DaggerEspressoTestApplicationComponent;
                   ^
  symbol:   class DaggerEspressoTestApplicationComponent
  location: package com.foo.di
foo/app/src/androidTest/java/com/foo/di/EspressoTestApplicationComponent.java:32: error: [com.foo.dependencyinjection.AppComponent.inject(com.foo.dependencyinjection.FooApp)] android.app.Application cannot be provided without an @Inject constructor or from an @Provides-annotated method.
public interface EspressoTestApplicationComponent extends AppComponent {
       ^
      android.app.Application is injected at
          com.foo.utilities.OrganizationManager.mApplication
      com.foo.utilities.OrganizationManager is injected at
          com.foo.dependencyinjection.FooApp.organizationManager
      com.foo.dependencyinjection.FooApp is injected at
          com.foo.dependencyinjection.AppComponent.inject(arg0)
2 errors

Это выглядит как DaggerEspressoTestApplicationComponent (которая должна быть сгенерированной версией EspressoTestApplicationComponent) не генерируется. Кроме того, я не уверен, является ли сбой этого класса генерацией причиной последней ошибки, или последняя ошибка является причиной того, что класс не генерируется в первую очередь.

Примечание. В этом приложении используется функция "Android Injector", представленная в Dagger 2.10/2.11. Я не уверен, является ли это частью проблемы или нет.

Почему эти ошибки происходят? Почему DaggerEspressoTestApplicationComponent не генерируется? Как можно решить эти проблемы?

0 ответов

Другие вопросы по тегам