2017-02-13 3 views
1

Ich habe die folgende Testklasse erstellt. Das Problem ist, dass DaggerTestDiComponent nicht gefunden wird - obwohl ich es im Build-Verzeichnis sehen kann.Dolch-Testkomponente nicht gefunden

Ich habe ähnliche SO Fragen durchgesehen, aber sie scheinen ältere Versionen von Gradle/Dagger2 zu betreffen und scheinen nicht zu gelten (zumindest von dem, was ich sehen kann). Mein App-Dagger-Code funktioniert einwandfrei.

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

}

Meine build.gradle Datei sieht wie folgt aus:

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' 

} 

Hier TestDiComponent

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

    void inject(TestMvpEngineeringPresenter testMvpEngineeringPresenter); 

} 

Hier ist 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

wenn sein kompiliert immer dann defintely Klasse ist in der App gibt ... wenn man bedenkt, AS # 1. Schließen Sie die App aus der letzten Zeit am Telefon und dann führen Sie das Projekt, weil manchmal AS nur Ihre letzte Änderung implementiert ... # 2. in setup() fügen Sie einen Timer hinzu, um diesen Code nach sagen 2 Sekunden nur um zu bestätigen, wegen des Ladens dieser Klasse (nur um zu bestätigen) für weitere ich denke, ein bisschen mehr von dem Code oder Flow wird helfen (atleast für mich :)) Ignorieren, wenn es nicht hilft ... – Ahmad

+0

Ich versuchte # 1 ohne Glück. Ich kann # 2 wegen des Kompilierungsproblems nicht tun. Ich habe einen zusätzlichen Code (TestDiComponent und TestAppModule) aus meinem Projekt hinzugefügt. – Eric

Antwort

3

Vielleicht finden Sie die Klassen unter Ihrem androidTest-Ordner und Sie fügen nicht dagger-compile lib als androidTestCompileAnnotationProcessor/androidTestCompileAnnotationProcessor zu Ihrer Gradle-App-Datei hinzu. Das erlaubt dem Dolch-Compiler nicht, DaggerXXX-Klassen unter Ihrem androidTest-Ordner zu generieren.

+0

Ich mache das tatsächlich unter der Test-Domain (nicht androidTest). – Eric

0

Ich habe versucht, Kommentar dazu hinzuzufügen, aber die Formatierung war lausig, so werde ich als Antwort hinzufügen, aber es ist etwas unvollständig.

Android Studio sagt immer noch, dass es die generierte DaggerTestDiComponent-Klasse nicht finden kann, aber mein Code wird ausgeführt und der Test wird ausgeführt.

Als Referenz 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' 
} 

ich meine TestAppModule.getStationModel auch verspotten nicht meine StationModel Klasse geändert, da ich nicht in der Lage war es die Art und Weise zu verspotten ich dachte, ich könnte (ich gerade lerne Mockito). Also hier, die ist:

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

}