我最近开始从事一个新项目,其中包括基于 Robolectric 的单元测试。
从 Android Studio (v3.6) 运行时,所有测试均成功通过。
奇怪的是,当我从终端使用 ./gradlew test
运行某些测试时,它们失败了,并出现非常可怕的错误:
java.lang.VerifyError: Stack map does not match the one at exception handler 56
Exception Details:
Location:
com/google/android/gms/measurement/internal/zzjy.zza(Landroid/net/Uri;)Landroid/os/Bundle; @56: astore
Reason:
Type 'java/lang/String' (current frame, locals[5]) is not assignable to null (stack map, locals[5])
Current Frame:
bci: @51
flags: { }
locals: { 'com/google/android/gms/measurement/internal/zzjy', 'android/net/Uri', 'java/lang/String', 'java/lang/String', 'java/lang/String', 'java/lang/String' }
stack: { 'java/lang/UnsupportedOperationException' }
Stackmap Frame:
bci: @56
flags: { }
locals: { 'com/google/android/gms/measurement/internal/zzjy', 'android/net/Uri', 'java/lang/String', 'java/lang/String', 'java/lang/String', null }
stack: { 'java/lang/UnsupportedOperationException' }
Bytecode:
// redacted..
Exception Handler Table:
bci [16, 53] => handler: 56
Stackmap Table:
same_frame(@6)
full_frame(@53,{Object[#2],Object[#145],Object[#129],Object[#129],Object[#129],Object[#129]},{})
full_frame(@56,{Object[#2],Object[#145],Object[#129],Object[#129],Object[#129],Null},{Object[#143]})
full_frame(@74,{Object[#2],Object[#145],Object[#129],Object[#129],Object[#129],Object[#129]},{})
same_frame(@104)
append_frame(@128,Object[#172])
same_frame(@143)
same_frame(@160)
same_frame(@177)
append_frame(@201,Object[#129])
append_frame(@225,Object[#129])
append_frame(@249,Object[#129])
append_frame(@273,Object[#129])
append_frame(@297,Object[#129])
full_frame(@300,{Object[#2],Object[#145],Object[#129],Object[#129],Object[#129],Object[#129]},{})
at com.google.android.gms.measurement.internal.zzfl.<init>(com.google.android.gms:play-services-measurement-impl@@17.1.0:42)
at com.google.android.gms.measurement.internal.zzfl.zza(com.google.android.gms:play-services-measurement-impl@@17.1.0:285)
at com.google.firebase.analytics.FirebaseAnalytics.getInstance(com.google.android.gms:play-services-measurement-api@@17.1.0:9)
// redacted..
at org.robolectric.android.internal.AndroidTestEnvironment.lambda$installAndCreateApplication$0(AndroidTestEnvironment.java:276)
at org.robolectric.android.internal.AndroidTestEnvironment$$Lambda$45/1286999442.run(Unknown Source)
at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:75)
at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:276)
at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:169)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:301)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:243)
at org.robolectric.internal.SandboxTestRunner$2$$Lambda$28/968645498.run(Unknown Source)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at org.robolectric.internal.bytecode.Sandbox$$Lambda$29/1700079137.call(Unknown Source)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
为什么在 Android Studio 中测试通过,但在终端中测试失败?
最佳答案
Why the tests pass in Android Studio, but fail in terminal?
这是因为从 Android Studio 调用时使用的 JDK 版本与从终端调用时使用的 JDK 版本不匹配。
从终端调用时 Gradle 使用哪个 JDK 版本?
从终端运行时,Gradle 使用 JAVA_HOME
中定义的版本 - 在我的计算机上指向(旧版本)1.8.0-51。
从 Android Studio 调用时 Gradle 使用哪个 JDK 版本?
Starting from version 2.2 ,最新 OpenJDK 的副本与 Android Studio bundle 在一起。
例如,Android Studio 3.6 使用 OpenJDK v1.8.0-212。
您希望 Gradle 在从 Android Studio 运行任务时使用的 JDK 版本可以在 Project Structure
> SDK Location
> JDK Location< 中找到/设置
。默认情况下,它配置为使用 bundle 的 OpenJDK 版本。
我是如何解决这个错误的?
为了在 Android Studio 中重现错误,我将 JDK Location
更改为 JAVA_HOME
,再次运行测试(从 Android Studio),瞧!我只在终端中看到的错误现在也出现在 Android Studio 中。
为了解决从终端运行测试时遇到的失败问题,我已将 JAVA_HOME
指向的 JDK 更新为最新版本 (1.8.0-251),现在测试都通过了Android Studio 以及从终端使用 gradlew
运行时的情况。
关于android - Robolectric 测试在终端中失败,在 Android Studio 中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61520264/