Mockito + Dexmaker 测试在 Android < 4.4 上运行时崩溃

Posted

技术标签:

【中文标题】Mockito + Dexmaker 测试在 Android < 4.4 上运行时崩溃【英文标题】:Mockito + Dexmaker test crashes when run on Android < 4.4 【发布时间】:2014-11-03 19:58:27 【问题描述】:

我有一些 android-tests 在 4.4 / Kitkat 下的 android 版本上运行时会严重崩溃。

这些是我的 build.gradle 中的库

androidTestCompile 'org.mockito:mockito-core:1.9.5'
androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'

测试在 android 版本 4.4 上按预期运行,尽管我需要添加一些提示来告诉 Dexmaker 将其缓存放在哪里:

System.setProperty("dexmaker.dexcache", getInstrumentation().getContext().getCacheDir().getPath());

这是设备的 logcat 输出:

D/dalvikvm(1712):GC_FOR_ALLOC 释放 479K,19% 释放 2532K/3124K,暂停 3ms,总共 3ms D/dalvikvm(1712):GC_CONCURRENT 释放 427K,18% 释放 2595K/3136K,暂停 1ms+0ms,共 3ms D/dalvikvm(1712):GC_CONCURRENT 释放 311K,16% 释放 2686K/3188K,暂停 3ms+0ms,共 4ms D/dalvikvm(1712):GC_FOR_ALLOC 释放 127K,11% 释放 2852K/3188K,暂停 1ms,总共 1ms D/dalvikvm(1712):GC_FOR_ALLOC 释放 123K,7% 释放 3239K/3476K,暂停 4ms,总共 4ms D/dalvikvm(1712):GC_CONCURRENT 释放 53K,6% 释放 3276K/3476K,暂停 2ms+0ms,共 10ms D/dalvikvm(1712):DexOpt:---开始'Generated-1815896169.jar'(bootstrap=0)--- D/dalvikvm(1728):DexOpt:加载 1 毫秒,验证+选择 0 毫秒,82180 字节 D/dalvikvm(1712):DexOpt:---结束'Generated-1815896169.jar'(成功)--- D/dalvikvm(1712): DEX prep '/data/data/my.app.identifier/cache/Generated-1815896169.jar': 0ms 解压,15ms 重写 I/dalvikvm(1712):DexOpt:非法方法访问(调用 Ljava/lang/Object;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object;来自 LBackendAddressServiceImpl_Proxy;) I/dalvikvm(1712):找不到方法 my.app.identifier.backend.BackendAddressServiceImpl.internalClone,引用自方法 BackendAddressServiceImpl_Proxy.internalClone W/dalvikvm(1712): VFY: 无法解析虚拟方法 50: Lmy/app/identifier/backend/BackendAddressServiceImpl;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object; D/dalvikvm(1712):VFY:在 0x0019 处替换操作码 0x6f I/dalvikvm(1712):DexOpt:非法方法访问(调用 Ljava/lang/Object;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object;来自 LBackendAddressServiceImpl_Proxy;) I/dalvikvm(1712):找不到方法 my.app.identifier.backend.BackendAddressServiceImpl.internalClone,引用自方法 BackendAddressServiceImpl_Proxy.super$internalClone$java_lang_Object W/dalvikvm(1712):VFY:无法重新出售虚拟方法 50:Lmy/app/identifier/backend/BackendAddressServiceImpl;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object; D/dalvikvm(1712):VFY:在 0x0000 处替换操作码 0x6f D/dalvikvm(1712):GC_FOR_ALLOC 释放 652K,20% 释放 3138K/3904K,暂停 4ms,总共 4ms D/dalvikvm(1712):DexOpt:---开始'Generated1066861752.jar'(bootstrap=0)--- D/dalvikvm(1712):GC_CONCURRENT 释放 44K,21% 释放 3103K/3904K,暂停 0ms+1ms,共 2ms D/dalvikvm(1729):DexOpt:加载0ms,验证+选择0ms,81004字节 D/dalvikvm(1712):DexOpt:---结束'Generated1066861752.jar'(成功)--- D/dalvikvm(1712): DEX prep '/data/data/my.app.identifier/cache/Generated1066861752.jar': 0ms 解压,13ms 重写 I/dalvikvm(1712):DexOpt:非法方法访问(调用 Ljava/lang/Object;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object;来自 LAppConfigServiceImpl_Proxy;) I/dalvikvm(1712):找不到方法 my.app.identifier.config.AppConfigServiceImpl.internalClone,引用自方法 AppConfigServiceImpl_Proxy.internalClone W/dalvikvm(1712): VFY: 无法解析虚拟方法 17: Lmy/app/identifier/config/AppConfigServiceImpl;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object; D/dalvikvm(1712):VFY:在 0x0019 处替换操作码 0x6f I/dalvikvm(1712):DexOpt:非法方法访问(调用 Ljava/lang/Object;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object;来自 LAppConfigServiceImpl_Proxy;) I/dalvikvm(1712):找不到方法 my.app.identifier.config.AppConfigServiceImpl.internalClone,引用自方法 AppConfigServiceImpl_Proxy.super$internalClone$java_lang_Object W/dalvikvm(1712): VFY: 无法解析虚拟方法 17: Lmy/app/identifier/config/AppConfigServiceImpl;.internalClone (Ljava/lang/Cloneable;)Ljava/lang/Object; D/dalvikvm(1712):VFY:在 0x0000 处替换操作码 0x6f D/dalvikvm(1712):GC_CONCURRENT 释放 536K,22​​% 释放 3078K/3904K,暂停 1ms+1ms,共 7ms D/dalvikvm(1712):WAIT_FOR_CONCURRENT_GC 阻塞了 3 毫秒 D/dalvikvm(1712):GC_FOR_ALLOC 释放 492K,21% 释放 3098K/3904K,暂停 2ms,总共 2ms D/dalvikvm(1712):GC_FOR_ALLOC 释放 468K,20% 释放 3142K/3904K,暂停 2ms,总共 2ms D/dalvikvm(1712):GC_CONCURRENT 释放 247K,19% 释放 3174K/3904K,暂停 2ms+0ms,总共 4ms F/libc (1712):致命信号 11 (SIGSEGV) 位于 0x00000000 (code=1),线程 1725 (ationTestRunner) 我/调试(109):*** *** *** *** *** *** *** *** *** *** *** *** *** * ** *** I/DEBUG(109):构建指纹:'generic/vbox86p/vbox86p:4.2.2/JDQ39E/eng.buildbot.20140523.235904:userdebug/test-keys' 我/调试(109):修订:'0' I/DEBUG(109):pid:1712,tid:1725,名称:ationTestRunner >>> my.app.identifier 我/调试(109): 我/调试(109):堆栈: 我/调试(109):98c5bba0 00000000 我/调试(109):98c5bba4 00000000 我/调试(109):98c5bba8 00000000 我/调试(109):98c5bbac 00000000 我/调试(109):98c5bbb0 00000000 我/调试(109):98c5bbb4 00000000 我/调试(109):98c5bbb8 00000000 我/调试(109):98c5bbbc 00000000 我/调试(109):98c5bbc0 00000000 我/调试(109):98c5bbc4 00000000 我/调试(109):98c5bbc8 00000000 我/调试(109):98c5bbcc 00000000 我/调试(109):98c5bbd0 00000000 我/调试(109):98c5bbd4 00000000 我/调试(109):98c5bbd8 00000000 我/调试(109):98c5bbdc 00000000 I/DEBUG(109):#00 98c5bbe0 a652fb68 /dev/ashmem/dalvik-heap(已删除) I/DEBUG(109):98c5bbe4 a6487fe8 /dev/ashmem/dalvik-heap(已删除) I/DEBUG(109):98c5bbe8 a647f1c0 /dev/ashmem/dalvik-heap(已删除) I/DEBUG (109): 98c5bbec b66af3d1 /system/lib/libdvm.so (dvmRemoveFromReferenceTable(ReferenceTable*, Object**, Object*)+33) 我/调试(109):98c5bbf0 b6752ca0 /system/lib/libdvm.so 我/调试(109):98c5bbf4 b6751ff4 /system/lib/libdvm.so 我/调试(109):98c5bbf8 00000000 I/DEBUG (109): 98c5bbfc b66b3fd4 /system/lib/libdvm.so (dvmThreadSelf()+36) 我/调试(109):98c5bc00 00000007 I/DEBUG(109):98c5bc04 a652fc08 /dev/ashmem/dalvik-heap(已删除) I/DEBUG(109):98c5bc08 a647f198 /dev/ashmem/dalvik-heap(已删除) 我/调试(109):98c5bc0c b6751ff4 /system/lib/libdvm.so I/调试(109):98c5bc10 b7d30a28 [堆] I/DEBUG(109):98c5bc14 a647f180 /dev/ashmem/dalvik-heap(已删除) 我/调试(109):98c5bc18 98c5bcb8 [堆栈:1725] 我/调试(109):98c5bc1c b66ba5b7 /system/lib/libdvm.so(dvmReleaseTrackedAlloc+71) 我/调试(109):........ ........ 我/调试(109):#01 98c5bcc0 b7d30a28 [堆] 我/调试(109):98c5bcc4 00000000 我/调试(109):98c5bcc8 00000000 我/调试(109):98c5bccc 00000000 我/调试(109):98c5bcd0 00000000 我/调试(109):98c5bcd4 b6751ff4 /system/lib/libdvm.so I/调试(109):98c5bcd8 b7d30a28 [堆] I/DEBUG (109): 98c5bcdc b665bd72 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+178) 我/调试(109):98c5bce0 b7d30a28 [堆] 我/调试(109):98c5bce4 00000000 I/DEBUG (109): 98c5bce8 b7596339 /system/lib/libc.so (pthread_mutex_lock+9) 我/调试(109):98c5bcec b761eff4 /system/lib/libc.so I/调试(109):98c5bcf0 b7cf4e98 [堆] 我/调试(109):98c5bcf4 00000018 I/调试(109):98c5bcf8 b7cf4e68 [堆] I/DEBUG (109): 98c5bcfc b7596509 /system/lib/libc.so (pthread_mutex_unlock+25) 我/调试(109):........ ........ I/DEBUG(109):#02 b7d30a30 9f27f620 /dev/ashmem/dalvik-LinearAlloc(已删除) I/DEBUG(109):b7d30a34 9eee8000 /dev/ashmem/dalvik-aux-structure(已删除) I/DEBUG(109):b7d30a38 a647f180 /dev/ashmem/dalvik-heap(已删除) 我/调试(109):b7d30a3c 00000000 我/调试(109):b7d30a40 98c5bc70 [堆栈:1725] 我/调试(109):b7d30a44 00000000 我/调试(109):b7d30a48 98c5bd1c [堆栈:1725] 我/调试(109):b7d30a4c 0000000a 我/调试(109):b7d30a50 00000000 我/调试(109):b7d30a54 b665611c /system/lib/libdvm.so 我/调试(109):b7d30a58 00000000 我/调试(109):b7d30a5c 00000000 我/调试(109):b7d30a60 9edb6670 /system/framework/ext.jar 我/调试(109):b7d30a64 98c5c300 我/调试(109):b7d30a68 00000000 我/调试(109):b7d30a6c 00000000 D/AndroidRuntime(1704):关闭虚拟机 I/ActivityManager(464): 进程 my.app.identifier (pid 1712) 已经死亡。 W/ActivityManager(464):应用程序 my.app.identifier 运行检测 ComponentInfomy.app.identifier.test/android.test.InstrumentationTestRunner 崩溃 D/dalvikvm(1704):GC_CONCURRENT 释放 100K,19% 释放 462K/568K,暂停 0ms+0ms,共 2ms D/jdwp(1704):收到唤醒信号,退出选择 D/dalvikvm(1704):调试器已分离;对象注册表有 1 个条目 I/ActivityManager(464): 强制停止包 my.app.identifier appid=10048 user=0 D/Zygote (198):进程 1712 由信号 (11) 终止 W/ThrottleService(464):无法找到 iface rmnet0 的统计信息

在“较旧”的 android 版本上运行 Mockito / Dexmaker 是否有任何提示?

【问题讨论】:

你有没有找到任何解决方案,我面临同样的问题,在我的情况下,设备也正在重启。 到目前为止没有成功!我认为这个问题可能与code.google.com/p/dexmaker/issues/detail?id=29 有关 【参考方案1】:

我不是 100% 这样做的(或者我们在此期间更改的其他内容),但在 Dexmaker 1.2 中,这似乎已修复。

【讨论】:

以上是关于Mockito + Dexmaker 测试在 Android < 4.4 上运行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

android单元测试框架Mockito使用

Kotlin&Mockito单元测试在gradle中失败

Mockito

Junit/Mockito:选择使用模拟或集成测试运行测试

Mockito - JUnit + Mockito 单元测试之打桩 when().thenReturn()

Mockito单元测试