android 中的 Robolectic 测试抛出 java.lang.NoSuchFieldError: tag_on_apply_window_listener

问题描述

我正在尝试使用 Roboelectric 运行一个简单的单元测试,但是在尝试构建 Activity 时,我收到以下错误

new Blob([response.data])

罪魁祸首似乎是这一行:java.lang.Exception: Main looper has queued unexecuted runnables. This might be the cause of the test failure. You might need a shadowOf(getMainLooper()).idle() call. at org.robolectric.android.internal.AndroidTestEnvironment.checkStateAfterTestFailure(AndroidTestEnvironment.java:502) at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:581) at org.robolectric.internal.SandBoxTestRunner$2.lambda$evaluate$0(SandBoxTestRunner.java:263) at org.robolectric.internal.bytecode.SandBox.lambda$runOnMainThread$0(SandBox.java:89) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NoSuchFieldError: tag_on_apply_window_listener at androidx.core.view.ViewCompat$Api21Impl.setonApplyWindowInsetsListener(ViewCompat.java:4733) at androidx.core.view.ViewCompat.setonApplyWindowInsetsListener(ViewCompat.java:2510) at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:938) at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:693) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170) at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:303) at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:284) at com.vedantu.app.nativemodules.vQuiz.view.ui.MainQuizActivity.onCreate(MainQuizActivity.kt:31) at android.app.Activity.performCreate(Activity.java:6251) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:711) at org.robolectric.android.controller.ActivityController.lambda$create$0(ActivityController.java:106) at org.robolectric.shadows.ShadowPausedLooper.runPaused(ShadowPausedLooper.java:195) at org.robolectric.android.controller.ActivityController.create(ActivityController.java:106) at org.robolectric.android.controller.ActivityController.create(ActivityController.java:111) at org.robolectric.android.fakes.RoboMonitoringInstrumentation.startActivitySyncInternal(RoboMonitoringInstrumentation.java:66) at org.robolectric.android.internal.LocalActivityInvoker.startActivity(LocalActivityInvoker.java:40) at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:265) at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:195) at com.vedantu.app.nativemmodules.vQuiz.utils.ReferralUtilTest.testQuizHomeActivity(ReferralUtilTest.kt:109) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:575) ... 6 more

我的测试文件非常简单:

java.lang.NoSuchFieldError: tag_on_apply_window_listener

其他测试都没有问题。

解决方法

你在使用 gradle 设置吗

testImplementation "androidx.core:core-ktx:+"  ?

如果是这样,请尝试使用固定版本,例如 1.3.2。 我可以通过那个解决同样的问题。 看来 ViewCompat 的实现已更改。