Robolectri c тесты не пройдены в терминале, успешно в Android Studio - PullRequest
0 голосов
/ 30 апреля 2020

Я недавно начал работать над новым проектом, который включает в себя модульные тесты на основе Robolectri c.

При запуске из 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, но не работают в терминале?

1 Ответ

0 голосов
/ 30 апреля 2020

Почему тесты проходят в Android Studio, но не работают в терминале?

Это потому, что существует несоответствие версии JDK между той, которая используется при вызове из Android Studio и тот, который используется при вызове из терминала.



Какая версия JDK используется Gradle при вызове из терминала?

При запуске из терминала Gradle использует версию, определенную в JAVA_HOME, которая на моем компьютере указала (более старая версия) 1.8.0-51.

Какая версия JDK использовалась Gradle при вызове от Android Studio?

Начиная с версии 2.2 , копия последнего OpenJDK поставляется в комплекте с Android Studio.
Например, Android Studio 3.6 использует OpenJDK v1.8.0-212.

Версия JDK, которую вы хотите использовать в Gradle при запуске ваших задач из Android Studio, может быть найдена / установлена ​​на Project Structure> SDK Location> JDK Location. По умолчанию он настроен на использование встроенной версии OpenJDK.

Как я решил ошибку?

Чтобы воспроизвести ошибки в Android Studio я изменил JDK Location на JAVA_HOME, снова запустил тесты (с Android Studio) и вуаля! ошибки, которые я видел только в терминале, теперь появляются и в Android Studio.

Чтобы устранить сбои, которые я видел, когда запускал тесты из терминала, я обновил JDK, указанный JAVA_HOME, до последнего (1.8.0-251), и теперь тесты проходят оба в * 1054. * Studio и когда запускается с помощью gradlew из терминала.

...