2017-02-13 11 views
1

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

Я просмотрел похожие вопросы, но они, похоже, относятся к более старым версиям 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' 

} 

Вот TestDiComponent

@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(); 
} 

} 
+0

, если его получение скомпилирован то Defintely класс есть в вашем приложении ... имея в виду AS # 1. закрыть приложение из последних на телефоне, а затем запустить проект, потому что иногда AS просто реализует ур последние изменения ... # 2. в setup() добавьте таймер для вызова этого кода после 2 секунд, чтобы подтвердить его из-за загрузки этого класса (только для подтверждения) для дальнейшего я думаю, что немного больше кода или потока поможет (по крайней мере для меня :)) Игнорировать, если это не помогает ... – Ahmad

+0

Я пробовал # 1 без везения. Я не могу сделать # 2 из-за проблемы компиляции. Я добавил код добавления (TestDiComponent и TestAppModule) из моего проекта. – Eric

ответ

3

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

+0

Я фактически делаю это под тестом (не androidTest). – Eric

0

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

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

}