简体   繁体   English

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

[英]Robolectric tests fail in terminal, succeed in Android Studio

I've recently started to work on a new project, which includes Robolectric-based unit tests.我最近开始研究一个新项目,其中包括基于 Robolectric 的单元测试。

When ran from Android Studio (v3.6), all the tests pass successfully.从 Android Studio (v3.6) 运行时,所有测试均成功通过。
Strangely, some of the tests fail when I'm running them using ./gradlew test from terminal with very intimidating error:奇怪的是,当我从终端使用./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)

Why the tests pass in Android Studio, but fail in terminal?为什么测试在 Android Studio 中通过,但在终端中失败?

Why the tests pass in Android Studio, but fail in terminal?为什么测试在 Android Studio 中通过,但在终端中失败?

It's because there's a JDK version mismatch between the one that's used when invoked from Android Studio versus the one that's used when invoked from the terminal.这是因为从 Android Studio 调用时使用的版本与从终端调用时使用的版本之间存在 JDK 版本不匹配。



Which JDK version used by Gradle when invoked from the terminal?从终端调用时 Gradle 使用哪个 JDK 版本?

When ran from terminal, Gradle uses a version defined in JAVA_HOME - which on my machine pointed to (older version) 1.8.0-51.从终端运行时,Gradle 使用JAVA_HOME中定义的版本 - 在我的机器上指向(旧版本)1.8.0-51。

Which JDK version used by Gradle when invoked from Android Studio?从 Android Studio 调用时,Gradle 使用哪个 JDK 版本?

Starting from version 2.2 , a copy of the latest OpenJDK comes bundled with Android Studio.从版本 2.2 开始,最新的 OpenJDK 的副本与 Android Studio 捆绑在一起。
In example, Android Studio 3.6 uses OpenJDK v1.8.0-212.例如,Android Studio 3.6 使用 OpenJDK v1.8.0-212。

The JDK version you want Gradle to use when running your tasks from Android Studio can be found/set at Project Structure > SDK Location > JDK Location .您希望 Gradle 从 Android Studio 运行任务时使用的 JDK 版本可以在Project Structure > SDK Location > JDK Location中找到/设置。 By default, it is configured to use the bundled OpenJDK version.默认情况下,它被配置为使用捆绑的 OpenJDK 版本。

How did I solved the error?我是如何解决错误的?

In order to reproduce the errors in Android Studio, I've changed the JDK Location to JAVA_HOME , ran the tests (from Android Studio) again, and voila.为了重现 Android Studio 中的错误,我将JDK Location更改为JAVA_HOME ,再次运行测试(来自 Android Studio),瞧。 the errors I've seen only in terminal now appear in Android Studio as well.我只在终端中看到的错误现在也出现在 Android Studio 中。

To resolve the failures I've seen when ran the tests from terminal, I've updated the JDK pointed by JAVA_HOME to latest (1.8.0-251), and now tests pass both in Android Studio and when ran using gradlew from terminal.为了解决我在从终端运行测试时看到的故障,我已将JAVA_HOME指向的 JDK 更新为最新(1.8.0-251),现在测试在 Android Studio 和从终端使用gradlew运行时都通过了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM