gpt4 book ai didi

android - Robolectric 4 测试在 Robolectric.buildActivity().setup() 处失败,并出现 java.lang.NullPointerException : Bitmap config was null

转载 作者:行者123 更新时间:2023-12-02 20:54:25 29 4
gpt4 key购买 nike

使用 Robolectric.buildActivity().setup() 的 JUnit 测试在 AndroidX 和 Robolectric 4.3 下不一致地失败。通常在测试套件中,像这样的前两个测试会失败,但其他测试会通过。

我的公司一直在迁移到 AndroidX 和 Robolectric 4.3,在使我们的测试套件达到稳定状态的过程中,我们的一些测试一直失败。添加 @LooperMode(PAUSED) 是为了修复“主循环已将未执行的可运行对象排队。这可能是测试失败的原因。您可能需要一个shadowOf(getMainLooper()).idle()调用”消息,并且它停止了每个单个测试失败,但一些测试不一致仍然失败。我尝试转换为 ActivityScenario替换 Robolectric.buildActivity().setup(),但错误仍然相同。

这是一个示例代码部分,测试将在 Kotlin 初始化时失败。

private val activityController: ActivityController<TestHomeActivity> =
Robolectric.buildActivity(TestHomeActivity::class.java)
private val homeActivity = activityController.setup().get()

来自 Java 测试,其中代码位于 setUp() 方法中。

    @Before
public void setUp() throws Exception {
[...]

mFragmentActivity = Robolectric.buildActivity(TestHomeActivity.class).setup().get();

}

同样,大多数时候只有一组中的前两个测试会失败。所有其他测试都将成功初始化或通过setUp()

这是我收到的一条错误消息:

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:470)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:548)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

这是错误的顶部部分,但我相信关键就在这里。BitmapLruCache用于处理图像加载。

Caused by: java.lang.NullPointerException: Bitmap config was null.
at org.robolectric.shadows.ShadowBitmap.getBytesPerPixel(ShadowBitmap.java:674)
at org.robolectric.shadows.ShadowBitmap.getRowBytes(ShadowBitmap.java:410)
at org.robolectric.shadows.ShadowBitmap.getAllocationByteCount(ShadowBitmap.java:446)
at android.graphics.Bitmap.getAllocationByteCount(Bitmap.java)
at app.base.network.util.BitmapLruCache.putBitmap(BitmapLruCache.java:47)
at com.android.volley.toolbox.ImageLoader.onGetImageSuccess(ImageLoader.java:304)
at com.android.volley.toolbox.ImageLoader$2.onResponse(ImageLoader.java:271)
at com.android.volley.toolbox.ImageLoader$2.onResponse(ImageLoader.java:268)
at com.android.volley.toolbox.ImageRequest.deliverResponse(ImageRequest.java:257)
at com.android.volley.toolbox.ImageRequest.deliverResponse(ImageRequest.java:34)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at org.robolectric.shadows.ShadowPausedLooper$IdlingRunnable.run(ShadowPausedLooper.java:308)
at org.robolectric.shadows.ShadowPausedLooper.executeOnLooper(ShadowPausedLooper.java:273)
at org.robolectric.shadows.ShadowPausedLooper.idle(ShadowPausedLooper.java:85)
at org.robolectric.shadows.ShadowPausedLooper.idleIfPaused(ShadowPausedLooper.java:155)
at org.robolectric.android.controller.ActivityController.visible(ActivityController.java:174)
at org.robolectric.android.controller.ActivityController.setup(ActivityController.java:251)
at app.model.viewmodels.ViewModelTestHelper.setUp(ViewModelTestHelper.java:51)
at app.model.viewmodels.ViewModelUrlGeneratorTest.setUp(ViewModelUrlGeneratorTest.java:70)
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.RunBefores.evaluate(RunBefores.java:24)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)

最佳答案

这不是解决发生这种情况的完整解决方案,但我有一个解决方法。按照 this Robolectric 2.2 issue 中的步骤操作,我创建了这个类:

@Implements(Bitmap.class)
public class CustomBitmapShadow extends ShadowBitmap {
public CustomBitmapShadow() {
// can also be some other config value
setConfig(Bitmap.Config.ARGB_8888);
}
}

并将此 header 添加到之前失败的测试中。

@Config(shadows = {CustomBitmapShadow.class})

这并不能解释为什么我不必为 Robolectric 3 执行此操作,但它是一个解决方案。我对此并不完全满意,所以我会看看是否有人可以解决问题的根源。

关于android - Robolectric 4 测试在 Robolectric.buildActivity().setup() 处失败,并出现 java.lang.NullPointerException : Bitmap config was null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319160/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com