Ошибка установки кинжала для тестов эспрессо, компонент не сгенерирован и другие ошибки
Я настраиваю 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
не генерируется? Как можно решить эти проблемы?