Sto provando ad aggiungere il framework di test Espresso al mio progetto. Tuttavia, sono bloccato con questo NoClassDefFoundError per 3 giorni. Dopo aver cercato su Google ho trovato che test APK utilizza per impostazione predefinita il tipo di build DEBUG. Per qualche motivo ho bisogno di impostare Proguard su per il tipo di build di debug. Tuttavia, ottengo il seguente errore quando si esegue la mia configurazione di prova:NoClassDefFoundError per Android Espresso pugnale interno classe factory
06-02 15:27:01.105 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.UiControllerModule_ProvideUiControllerFactory
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory>
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory>
06-02 15:27:01.107 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.base.ViewFinderImpl_Factory>
06-02 15:27:01.109 19436-19457/com.lingyue.YqgAndroid E/TestLoader: Could not find class: android.support.test.espresso.base.ViewFinderImpl_Factory
06-02 15:27:01.114 19436-19457/com.lingyue.YqgAndroid I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.test.espresso.core.deps.dagger.internal.Factory>
06-02 15:27:01.115 19436-19457/com.lingyue.YqgAndroid E/AndroidRuntime: FATAL EXCEPTION: Instr: android.support.test.runner.AndroidJUnitRunner
Process: com.lingyue.YqgAndroid, PID: 19436
java.lang.NoClassDefFoundError: android.support.test.espresso.core.deps.dagger.internal.Factory
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:324)
at android.support.test.internal.runner.TestLoader.doLoadClass(TestLoader.java:92)
at android.support.test.internal.runner.TestLoader.loadIfTest(TestLoader.java:113)
at android.support.test.internal.runner.TestRequestBuilder.loadClassesFromClassPath(TestRequestBuilder.java:801)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:747)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:354)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:260)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
mio build.gradle sembra piace questo per le dipendenze:
dependencies {
compile "com.android.support:cardview-v7:${supportVersion}"
compile "com.android.support:recyclerview-v7:${supportVersion}"
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
compile 'com.loopj.android:android-async-http:1.4.9'
compile 'com.qiniu:qiniu-android-sdk:7.0.9'
compile 'com.mcxiaoke.gradle:packer-helper:1.0.4'
compile 'me.henrytao:smooth-app-bar-layout:23.2.1.1'
compile 'com.alipay.euler:andfix:[email protected]'
compile 'com.umeng.analytics:analytics:6.0.0'
compile fileTree('libs')
compile project(':framework')
compile project(':yqdsdk')
// Only needed at compilation
provided 'com.google.dagger:dagger-compiler:2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'
// For testing
androidTestCompile "com.android.support:support-annotations:${supportVersion}"
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
exclude group: 'javax.inject'
}
}
Tipi Costruire aspetto simile al seguente:
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
testProguardFile 'test-proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
testProguardFile.pro assomiglia a questo:
-dontobfuscate
-dontwarn
Quello che ho fatto:
- Se posso passare Proguard off per build di debug impostando minifyEnabled = false, il test viene eseguito con successo . Ottengo l'errore sopra altrimenti.
- Ho provato a mettere testProguardFile in "defaultConfig" e "debug", ma senza successo entrambi.
- Ho provato ad aggiungere un altro tipo di build "uiTest" con Proguard disattivato, ma la configurazione di test non funzionerà dopo aver impostato testBuildType su "uiTest". L'errore è che Android Studio non riconosce il runner di prova AndroidJUnitRunner.
Mi sembra che il problema derivi dall'uso combinato di proguard e dagger2 ma sono a corto di idee. Per favore aiuto.
migliori auguri
Ciao, mi sono imbattuto nello stesso identico problema. Cercando di eseguire i miei test di strumentazione con ProGuard attivato ma i test si bloccano con quell'eccezione. Ho anche un file ProGuard di test separato con regole simili. Nicholas, hai finito per trovare una soluzione per questo problema? – ivacf