2017-01-19 1 views
0

Hallo, ich habe das folgende Problem mit Dolch 2 in meinem (Teil-) Projekt, das vollständig pure-Java mit keine android Abhängigkeiten ist.Inject UnitTest-Klassen

Wenn ich die Komponententests unter Verwendung einiger Mocks (z. B. Injizieren eines Mock Network Connectors, der statische Strings zurückgibt) über die Gradle-Ansicht oder Konsole (businessModule: test) ausführen, gibt es keine Probleme und alle Tests sind erfolgreich. Aber wenn ich die Dateien in Android Studio öffne, sagt das Studio, dass die Rückgabe meiner DaggerMockComponent nicht mit dem Zieltyp kompatibel ist. Wenn ich die generierte Komponenten-Implementierung öffne, sehe ich, dass Android Studio denkt, dass die TestUnit-Klasse (und die Schnittstelle MockComponent) nicht verfügbar ist, also weiß es nicht, was die inject-Methode zurückgibt.

Ich habe folgende gradle Datei:

Plugin anwenden: 'java'

// allow inject of core into core. https://github.com/griffio/dagger2-example 
sourceSets { 
    dagger { 
     java { 
      srcDirs = ['src/dagger/java'] 
     } 
    } 
    daggerTest { 
     java { 
      srcDirs = ['src/daggerTest/java'] 
     } 
    } 
} 

configurations { 
    compileDagger 
} 

compileJava { 
    description = "dagger annotation processor is loaded automatically from classpath" 
    sourceSets.dagger.java.srcDirs*.mkdirs() 
    classpath += configurations.compileDagger 
    options.compilerArgs += [ 
      '-s', sourceSets.dagger.java.srcDirs.iterator().next() 
    ] 
} 

compileTestJava { 
    //dependsOn compileDaggerTestJava 
    description = "dagger annotation processor is loaded automatically from classpath" 
    sourceSets.daggerTest.java.srcDirs*.mkdirs() 
    classpath += configurations.compileDagger 
    options.compilerArgs += [ 
      '-s', sourceSets.daggerTest.java.srcDirs.iterator().next() 
      //'-s src/testDaggerJava' 
    ] 
} 

task deleteDagger(type: Delete) { 
    delete 'src/dagger', 'src/daggerTest' 
} 

clean.dependsOn deleteDagger 

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

    // Force Java 7 as newer versions can not be processed by dex for API 21 
    targetCompatibility = '1.7' 
    sourceCompatibility = '1.7' 

    [...] 

    // Dagger for dependency injection 
    compile 'com.google.dagger:dagger:2.8' 
    testCompile 'com.google.dagger:dagger:2.8' 
    compileOnly 'com.google.dagger:dagger-compiler:2.8' 
    testCompileOnly 'com.google.dagger:dagger-compiler:2.8' 

    [...] 

    testCompile 'junit:junit:4.12' 

} 

Vielen Dank für Ihre Hilfe.

Antwort

0

Ok alle, nach einer weiteren Nacht und einige der Forschung auf dem Android-apt-Plugin ich über die reine Java apt (net.ltgt.apt) stolperte und jetzt habe ich eine funktionierende Lösung in Kombination mit der Idee-Plugin

apply plugin: 'java' 
apply plugin: "net.ltgt.apt" 
apply plugin: "idea" 

task cleanGenerated(type: Delete) { 
    delete 'build' 
} 

clean.dependsOn cleanGenerated 


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

    // Force Java 7 as newer versions can not be processed by dex for API 21 
    targetCompatibility = '1.7' 
    sourceCompatibility = '1.7' 

    [...] 

    // Dagger for dependency injection 
    compile 'com.google.dagger:dagger:2.8' 
    apt 'com.google.dagger:dagger-compiler:2.8' 
    testCompile 'com.google.dagger:dagger:2.8' 
    testApt 'com.google.dagger:dagger-compiler:2.8' 

    [...] 

    testCompile 'junit:junit:4.12' 

} 

Natürlich müssen Sie die Abhängigkeit und plugin-name in der Root-Gradle-Datei hinzufügen, aber das ist in der documentation for net.ltgt.apt geschrieben - hoffe, das funktioniert auch für Sie.