2014-04-30 10 views
6

Używam sztyletu w aplikacji na Androida. Działa w aplikacji, ale po uruchomieniu testów instrumentacji otrzymuję komunikat NoClassDefFoundError.Kod sztyletu podający NoClassDefFoundError w testach oprzyrządowania Androida, ale działa w normalnej aplikacji

Używam Gradle i Espresso. Dzieje się to BEZ progaurdu.

Jest to dziwne, ponieważ ładowanie "Module $$ ModuleAdapter" jest wczytywane, ale "Module $$ ModuleAdapter $ EndpointProvidesAdapter" nie jest.

Wyciągnąłem plik APK z powrotem z urządzenia i użyłem dexdump, aby sprawdzić, czy klasa rzeczywiście znajduje się w pliku APK, "Module $$ ModuleAdapter $ EndpointProvidesAdapter".

Jakieś pomysły na przyczyny tego problemu?

java.lang.NoClassDefFoundError: Module$$ModuleAdapter$EndpointProvidesAdapter 
      at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:33) 
      at ...Module$$ModuleAdapter.getBindings(MslModule$$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 ...Application.onCreate(...Application.java:21) 
      at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.ClassNotFoundException: Didn't find class ...Module$$ModuleAdapter$MslEndpointProvidesAdapter" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/....test-1.apk", zip file "/data/app/...-2.apk"],nativeLibraryDirectories=[/data/app-lib/....test-1, /data/app-lib/...-2, /vendor/lib, /system/lib]] 
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:497) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 
            at ...Module$$ModuleAdapter.getBindings(MslModule$$ModuleAdapter.java:33) 
            at ...Module$$ModuleAdapter.getBindings(MslModule$$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 ...eApplication.onCreate(...Application.java:21) 
            at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007) 
            at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344) 
            at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5017) 

Odpowiedz

3

To wydaje się być bardziej związane ze sposobem byłem w tym Espresso niż jest to kwestia Dagger ...

androidTestCompile ('com.google.android.apps.common.testing:espresso:1.1'){ 
     exclude group: 'com.squareup.dagger' 
} 

Przełączanie Jake Wharton "podwójnego espresso" sprawiły, że problem znika .

https://github.com/JakeWharton/double-espresso

ja nadal nie wiem, dlaczego, że spowodowałoby NoClassDefFoundError na tym Dagger generowane klasy.

5

Podwójne espresso jest teraz przestarzałe na rzecz Espresso 2.0. Możliwe, że zadziałał on dla ciebie, ponieważ Jake wykonał dobrą robotę wyliczając przechodnie zależności, które być może będziesz musiał wykluczyć, aby wszystko działało.

Z mojego doświadczenia wynika, używając Espresso 2.0 z Dagger może wymagać, aby wykluczyć javax.inject ze swoimi zależnościami espresso:

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

może trzeba to zrobić dla wszystkich uzależnień espresso że projekt obejmuje.