android - Robolectric 测试在终端中失败,在 Android Studio 中成功

标签 android robolectric

我最近开始从事一个新项目,其中包括基于 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/

相关文章:

android - 使 ListView 移动到最后一项位置

android - 测试时,Hilt Fragment 必须附加到@AndroidEntryPoint Activity (它附加到@AndEntPoint 标记的 Activity )

android - AnimatorProxy 中使用 Robolectric 的 Nineoldandroids NullPointerException

android - 使用 JUnit + 的单元测试用例(Android 中的 Robolectric 或 Mockito 或两者)

java - 运行测试时 Robolectric PowerMock java.lang.NoClassDefFoundError 错误

android - 如何将 TestNG 与 Robolectric 一起使用?

android - 从主 Activity 调用自定义 View 。打印 onDraw() 中的消息但未呈现自定义 View

java - 在Android中创建基于表插入的通知

android - Jetpack Compose 将文本内容对齐到脚手架的中心

php - Cordova 安卓 :Loading data from database with infinite scrolling in onsenui