2016-06-02 15 views
5

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:

  1. Se posso passare Proguard off per build di debug impostando minifyEnabled = false, il test viene eseguito con successo . Ottengo l'errore sopra altrimenti.
  2. Ho provato a mettere testProguardFile in "defaultConfig" e "debug", ma senza successo entrambi.
  3. 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

+0

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

risposta

0

Dopo aver fatto ulteriori ricerche, ho trovato una soluzione per questo problema, anche se non è semplice:

  1. aggiungere un nuovo tipo di costruzione e sincronizzare la costruzione del progetto, ad esempio,

    uiTest { minifyEnabled vero }

  2. Sul lato sinistro verso il basso dello Studio Android, clicca su "Crea varianti". Per il modulo dell'applicazione, scegli la variante di build appena aggiunta, ad es. "UiTest".

  3. Eseguire l'applicazione.

Questo è un po 'scomodo perché è necessario passare avanti e indietro quando è necessario eseguire il test in diverse varianti di costruzione. Ma fa funzionare Expresso.

Problemi correlati