Компонент теста Dagger не найден

Я создал следующий тестовый класс. Проблема в том, что DaggerTestDiComponent не найден, хотя я вижу его в каталоге сборки.

Я просмотрел похожие вопросы SO, но они, похоже, касаются более старых версий gradle/Dagger2 и, похоже, не применяются (по крайней мере, из того, что я вижу). Код моего приложения Dagger работает нормально.

public class TestMvpEngineeringPresenter {

@Mock
IMvpEngineeringView iMvpEngineeringView;

@Inject
MvpEngineeringPresenter mvpEngineeringPresenter;

@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();

@Before
public void setUp() {

    TestDiComponent component = DaggerTestDiComponent.builder()
            .testAppModule(new TestAppModule()).build();
    component.inject(this);
}

@Test
public void testStationControlSwitchChange() {

    mvpEngineeringPresenter.assignEngineeringView(iMvpEngineeringView);
    mvpEngineeringPresenter.onLoad();

    mvpEngineeringPresenter.switchChanged(new SwitchChange(0, true));
    assertEquals(true, mvpEngineeringPresenter.iStationModel.getStationControls().get(0).isOnOff());
    mvpEngineeringPresenter.switchChanged(new SwitchChange(0, false));
    assertEquals(false, mvpEngineeringPresenter.iStationModel.getStationControls().get(0).isOnOff());
}

}

Мой файл build.gradle выглядит так:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
    applicationId "com.fisincorporated.mvc_mvp_mvvm"
    minSdkVersion 25
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    dataBinding {
        enabled = true
    }
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

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'
})


// Android support stuff
compile 'com.android.support:design:25.0.1'
compile 'com.android.support:appcompat-v7:25.0.1'
compile 'com.android.support:recyclerview-v7:25.0.1'


// Butterknife - also includes library for Dagger
compile 'com.jakewharton:butterknife:8.4.0'
compile 'com.google.dagger:dagger:2.8'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

// For MVP Observer/Subscriber
compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'

// For Dagger2
// compile 'com.google.dagger:dagger:2.8'  // Added above for ButterKnife
annotationProcessor 'com.google.dagger:dagger-compiler:2.8'

// For testing
testCompile 'junit:junit:4.12'

// Mockito of course!
testCompile "org.mockito:mockito-core:2.+"
testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.8'

}

Вот ТестДиКомпонент

@Singleton
@Component(modules = {TestAppModule.class})  // comma separated list of  classes
public interface TestDiComponent {

    void inject(TestMvpEngineeringPresenter testMvpEngineeringPresenter);

}

Вот TestAppModule

@Module
public class TestAppModule {

@Provides
public IStationModel getStationModel() {

    IStationModel iStationModel = Mockito.mock(IStationModel.class);
    when(iStationModel.getStationName()).thenReturn("Mocked Station");
    when(iStationModel.getStationControls().size()).thenReturn(2);
    when(iStationModel.getBigButtonName()).thenReturn(("Log Button"));
    when(iStationModel.getLogHint()).thenReturn("Enter log text here");

    for (int i = 0; i < 2; ++i) {
        when(iStationModel.getStationControls().get(i)).thenReturn(new StationControl("Test Switch" + i,false));
    }
    return iStationModel;
}

@Provides
public MvpEngineeringPresenter getMvpEngineeringPresenter() {
    return new MvpEngineeringPresenter();
}

}

person Eric    schedule 13.02.2017    source источник
comment
если он компилируется, то класс определенно есть в вашем приложении... имея в виду AS # 1. закройте приложение из последнего на телефоне, а затем запустите проект, потому что иногда AS просто реализует ваше последнее изменение... #2. в setup() добавьте таймер для вызова этого кода, скажем, через 2 секунды, просто чтобы подтвердить его из-за загрузки этого класса (просто для подтверждения). Для дальнейшего я думаю, что немного больше кода или потока поможет (по крайней мере, для меня :)) Игнор, если не поможет...   -  person Ahmad    schedule 13.02.2017
comment
Пробовал №1, безрезультатно. Я не могу сделать № 2 из-за проблемы с компиляцией. Я добавил дополнительный код (TestDiComponent и TestAppModule) из своего проекта.   -  person Eric    schedule 14.02.2017


Ответы (3)


Возможно, вы находите классы в папке androidTest и не добавляете библиотеку dagger-compile lib как androidTestCompileAnnotationProcessor/androidTestCompileAnnotationProcessor в файл приложения Gradle. Это не позволяет компилятору кинжала генерировать классы DaggerXXX в вашей папке androidTest.

person Sergio Martínez    schedule 14.02.2017
comment
На самом деле я делаю это в домене test (не androidTest). - person Eric; 15.02.2017

Я пытался добавить комментарий к этому, но форматирование было паршивым, поэтому я добавлю как ответ, но он несколько неполный.

Android Studio по-прежнему говорит, что не может найти сгенерированный класс DaggerTestDiComponent, но мой код выполняется, и тест запускается.

Для справки build.gradle:

apply plugin: 'com.android.application'


android {
 compileSdkVersion 25
 buildToolsVersion "25.0.0"
 defaultConfig {
  applicationId "com.fisincorporated"
  minSdkVersion 25
  targetSdkVersion 25
  versionCode 1
  versionName "1.0"
  testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

  dataBinding {
   enabled = true
  }
 }
 buildTypes {
  release {
   minifyEnabled false
   proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
 }
}

dependencies {
 compile fileTree(dir: 'libs', include: ['*.jar'])

 // Android support stuff
 compile 'com.android.support:design:25.0.1'
 compile 'com.android.support:appcompat-v7:25.0.1'
 compile 'com.android.support:recyclerview-v7:25.0.1'



 // Butterknife - also includes library for Dagger
 compile 'com.jakewharton:butterknife:8.4.0'
 compile 'com.google.dagger:dagger:2.9'
 provided 'javax.annotation:jsr250-api:1.0'
 annotationProcessor('com.jakewharton:butterknife-compiler:8.4.0', {
  exclude group: 'com.android.support',
  module: 'support-annotations'
 })

 // For MVP Observer/Subscriber
 compile 'io.reactivex:rxandroid:1.2.0'
 compile 'io.reactivex:rxjava:1.1.5'

 // For Dagger2
 // compile 'com.google.dagger:dagger:2.8'  // Added above for ButterKnife
 annotationProcessor 'com.google.dagger:dagger-compiler:2.9'

 // For testing
 testCompile 'junit:junit:4.12'

 // Mockito
 testCompile 'org.mockito:mockito-core:2.4.0'
 testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9'
  //provided 'javax.annotation:jsr250-api:1.0'

 // For Android/Mockito testing
 androidTestCompile 'junit:junit:4.12'
 androidTestCompile('com.android.support.test:runner:0.5', {
  exclude group: 'com.android.support',
  module: 'support-annotations'
 })
 androidTestCompile 'com.android.support.test:rules:0.5'
 androidTestCompile 'org.mockito:mockito-core:2.+'
 androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
 androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'

 // Android espresso testing
 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
   exclude group: 'com.android.support',
   module: 'support-annotations'
  })
  // androidTestCompile 'com.android.support.test:runner:0.5'   added above
  // following added to get past version conflict
 androidTestCompile 'com.android.support:support-annotations:25.0.1'
}

Я также изменил свой TestAppModule.getStationModel, чтобы он не издевался над моим классом StationModel, поскольку я не мог издеваться над ним так, как думал (я только изучаю Mockito). Итак, вот что:

@Module
public class TestAppModule {

    @Provides
    @Singleton
    public IStationModel getStationModel() {

        IStationModel iStationModel =  StationModel.getStationModel();
        return iStationModel;
    }

    @Provides
    public MvpEngineeringPresenter getMvpEngineeringPresenter(IStationModel istationModel) {
        return new MvpEngineeringPresenter(istationModel);
    }

}
person Eric    schedule 14.02.2017

я только что добавил

 testAnnotationProcessor 'com.google.dagger:dagger-compiler:${daggerVersion}'

и это работает для меня

person Sattar    schedule 07.04.2019