2014-12-24 14 views
14

Inizia ad esplorare Espresso 2.0, ma sembra che si siano imbattuti in un singhiozzo. Non riesco a far eseguire i test con successo contro qualsiasi progetto che includa Dagger. Quando eseguo i test ottengo la seguente eccezione (intera StackTrace alla fine):Codice Dagger che emette NoClassDefFoundError quando vengono eseguiti Espresso Test, la normale esecuzione funziona bene

java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter 

l'applicazione viene eseguita quando non si va dalla AndroidInstrumentationTest.

Ecco alcuni dei file rilevanti, ho anche caricato il progetto su github per consentire un checkout/riproduzione più veloce https://github.com/paul-turner/espressoDaggerExample.

build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.pdt.daggerexample" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     minSdkVersion 16 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      minifyEnabled false 
     } 


    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/services/javax.annotation.processing.Processor' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.jakewharton:butterknife:5.1.1' 
    compile 'com.squareup.dagger:dagger:1.2.2' 
    provided 'com.squareup.dagger:dagger-compiler:1.2.2' 
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1' 
} 

prova:

public class SampleEspressoTest extends ActivityInstrumentationTestCase2<MainActivity> { 

    public SampleEspressoTest() { 
     super(MainActivity.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     // Espresso will not launch our activity for us, we must launch it via getActivity(). 
     getActivity(); 
    } 

    public void testCheckText() { 
     onView(ViewMatchers.withId(com.pdt.daggerexample.R.id.espresso_test)) 
       .check(matches(withText("Espresso Test"))); 
    } 
} 

Modulo:

package com.pdt.daggerexample.model; 

import com.pdt.daggerexample.inject.DaggerExampleApplication; 
import com.pdt.daggerexample.MainActivity; 
import com.pdt.daggerexample.SecondActivity; 

import javax.inject.Singleton; 

import dagger.Module; 
import dagger.Provides; 

@Module(injects = { 
     MainActivity.class, 
     SecondActivity.class, 
}, complete = true) 

public class DaggerExampleAppModule { 

    private final DaggerExampleApplication mDaggerExampleApplication; 

    public DaggerExampleAppModule(DaggerExampleApplication daggerExampleApplication) { 
     mDaggerExampleApplication = daggerExampleApplication; 
    } 

    @Provides 
    @Singleton 
    public MySingleton provideMySingleton() { 
     return new MySingleton(mDaggerExampleApplication.getApplicationContext(), "FOOBAR!"); 
    } 

    @Provides 
    public MyRegularOldClassInstance provideMyRegularOldClassInstance() { 
     return new MyRegularOldClassInstance(); 
    } 

} 

Stacktrace:

12-24 15:18:17.986 1282-1282/? E/MonitoringInstrumentation﹕ Dying now... 
    12-24 15:18:17.986 1282-1282/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     java.lang.NoClassDefFoundError: com/pdt/daggerexample/model/DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter 
       at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28) 
       at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13) 
       at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185) 
       at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138) 
       at dagger.ObjectGraph.create(ObjectGraph.java:129) 
       at com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16) 
       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999) 
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151) 
       at android.app.ActivityThread.access$1300(ActivityThread.java:130) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255) 
       at android.os.Handler.dispatchMessage(Handler.java:99) 
       at android.os.Looper.loop(Looper.java:137) 
       at android.app.ActivityThread.main(ActivityThread.java:4745) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:511) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
       at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.ClassNotFoundException: com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter$ProvideMySingletonProvidesAdapter 
       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:28) 
                at com.pdt.daggerexample.model.DaggerExampleAppModule$$ModuleAdapter.getBindings(DaggerExampleAppModule$$ModuleAdapter.java:13) 
                at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185) 
                at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138) 
                at dagger.ObjectGraph.create(ObjectGraph.java:129) 
                at com.pdt.daggerexample.inject.DaggerExampleApplication.onCreate(DaggerExampleApplication.java:16) 
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:999) 
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4151) 
                at android.app.ActivityThread.access$1300(ActivityThread.java:130) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255) 
                at android.os.Handler.dispatchMessage(Handler.java:99) 
                at android.os.Looper.loop(Looper.java:137) 
                at android.app.ActivityThread.main(ActivityThread.java:4745) 
                at java.lang.reflect.Method.invokeNative(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:511) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                at dalvik.system.NativeStart.main(Native Method) 
+0

Ho appena eseguito il test e funziona benissimo ... – Emmanuel

+0

@ Emmanuel Quale versione di AS (o se command line quale comando), contro quale dispositivo (AVD o dispositivo reale collegato)? L'ho clonato fresco un paio di volte e mi sono imbattuto nell'errore ogni volta. – pturner

+0

Penso che fosse AS 0.9.3 ed era Genymotion - Nexus 5 con Lollipop – Emmanuel

risposta

21

Questo problema mi ha dato un po '. Probabilmente è necessario escludere javax.inject dalla dipendenza dell'espresso. Le versioni precedenti di Android sembrano essere meno tolleranti rispetto alle dipendenze identiche.

Qualcosa sulla falsariga di:

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') { 
    exclude group: 'javax.inject' 
} 

Attenzione che questo può mordere tutto il luogo. I registri del dispositivo di emulazione hanno alcuni utili suggerimenti su dove si verificano le collisioni. Ad esempio:

(Ldagger/internal/Binding; had used a different Ljavax/inject/Provider; during pre-verification) 

o

DexOpt: not resolving ambiguous class 'Ljunit/framework/TestSuite;' 
+0

Grazie - ha funzionato - ma puoi dare qualche informazione sul perché? Sono perplesso perché questo aiuta a risolvere il problema .. – ligi

+0

Grazie, è stato bloccato su questo. Per ligi è un problema di namespace, non è possibile includere lo stesso package/namespace in una build due volte. Quindi dici al test di compilare di non costruire in javax.inject perché il dagger introdurrà quello spazio dei nomi – Scrotos

0

Ho risolto questo problema aggiungendo al Gradle il seguente codice:

configurations { 
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4' 
} 
Problemi correlati