虚拟设备上的检测测试失败

时间:2014-05-20 18:43:42

标签: android android-testing android-espresso

我正在使用Jake Wharton的Double Espresso库在我的应用中设置Instrumentation测试。测试在我的手机上正常运行但在任何虚拟设备上崩溃(我尝试过模拟器和Genymotion设备)。

我得到的错误是[先前] [(Instrumentation run failed due to 'java.lang.IllegalAccessError'. Gradle + Espresso)报告的IllegalAccessError。然而,令我困惑的是为什么它只发生在虚拟设备上。如果设置应该没问题。它可以在物理设备上运行。

堆栈跟踪包括整个地方的错误,但报告为致命的错误是:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
        at com.myApp.onCreate(MyApp.java:32)
        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)

无论如何,我尝试排除可能发生冲突的所有库,但我仍然无法使其工作。有没有人对这个问题可能有什么想法,甚至是如何排除故障?

这个问题似乎与应用程序中使用的daggger有关。 MyApp:32指向创建ObjectGraph的行,并且以下两行在stacktrace中。

W/dalvikvm﹕ Class resolved by unexpected DEX: Lcom/myApp/MyApp;(0xa4df7388):0x97542000 ref [Ldagger/ObjectGraph;] Ldagger/ObjectGraph;(0xa4df7388):0x97add000
W/dalvikvm﹕ (Lcom/myApp/MyApp; had used a different Ldagger/ObjectGraph; during pre-verification)

**更新:**问题可能与虚拟设备上的Dalvik VM有关。我的手机设置为ART,并报告了与Dalvik类似的问题previously。应该通过添加以下内容来修复:

androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
  exclude group: 'com.squareup.dagger'
}

根据图书馆页面但似乎没有帮助。

1 个答案:

答案 0 :(得分:4)

问题实际上是由espresso-support库引起的。我还需要添加com.squareup.dagger作为排除项,而我只是将排除项添加到其他库中。

androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
    exclude group: 'com.squareup.dagger'
}
androidTestCompile ('com.jakewharton.espresso:espresso-support-v4:1.1-r3') {
    exclude group: 'com.squareup.dagger'  // this goes here too
    exclude group: 'com.android.support', module: 'support-v4'
}