首页 > 解决方案 > Robolectric 和 RecyclerView StackOverflow

问题描述

在我的单元测试中,我正在设置一个包含 RecyclerView 的 Activity。打电话时ActivityController.visible()我得到一个java.lang.StackOverflowError. RecyclerView适配器的以下方法的第一行出现错误:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.task_list_content, parent, false);

    System.out.println("CVH " + cont++);

    return new ViewHolder(view);
}

永远不会打印出“CVH”行。

在测试中,我以这种方式设置活动:

MainActivity activity = Robolectric.setupActivity(MainActivity.class);

请注意,我使用的是导航库,因此只有一个 Activity,而 RecyclerView 实际上位于 Fragment 内。

我正在使用 Robolectric 4.3.1 版

这是堆栈跟踪,...重复随机次数之间的块(大约 20 次)

java.lang.StackOverflowError
  at java.base/java.lang.Throwable.getStackTrace(Throwable.java:820)
  at org.robolectric.internal.bytecode.ShadowWrangler.stripStackTrace(ShadowWrangler.java:352)
  at org.robolectric.internal.bytecode.RobolectricInternals.cleanStackTrace(RobolectricInternals.java:45)
  at android.view.ViewGroup.resolveRtlPropertiesIfNeeded(ViewGroup.java)
  at android.view.View.measure(View.java:24540)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
  at com.google.android.material.appbar.AppBarLayout.onMeasure(AppBarLayout.java:427)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:760)
  at com.google.android.material.appbar.AppBarLayout$BaseBehavior.onMeasureChild(AppBarLayout.java:1507)
  at com.google.android.material.appbar.AppBarLayout$Behavior.onMeasureChild(AppBarLayout.java:1196)
  at com.google.android.material.appbar.AppBarLayout$BaseBehavior.onMeasureChild(AppBarLayout.java:1215)
  .
  .
  .
  at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:831)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3006)
  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1833)
  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2122)
  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1721)
  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7598)
  at android.os.Handler.handleCallback(Handler.java:883)
  at android.os.Handler.dispatchMessage(Handler.java:100)
  at org.robolectric.shadows.ShadowLegacyMessageQueue.dispatchMessage(ShadowLegacyMessageQueue.java:157)
  at org.robolectric.shadows.ShadowLegacyMessageQueue.access$200(ShadowLegacyMessageQueue.java:42)
  at org.robolectric.shadows.ShadowLegacyMessageQueue$1.run(ShadowLegacyMessageQueue.java:135)
  at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:407)
  at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:279)
  at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:261)
  at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:244)
  at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:234)
  at org.robolectric.util.Scheduler.setIdleState(Scheduler.java:89)
  at org.robolectric.util.Scheduler.unPause(Scheduler.java:124)
  at org.robolectric.shadows.ShadowLegacyLooper.unPause(ShadowLegacyLooper.java:267)
  at org.robolectric.shadows.ShadowLegacyLooper.runPaused(ShadowLegacyLooper.java:324)
  at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:36)
  at android.view.ViewGroup.addView(ViewGroup.java)
  at android.view.ViewGroup.addView(ViewGroup.java:4907)
  at android.view.LayoutInflater.rInflate(LayoutInflater.java:1127)
  at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
  at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
  at com.example.view.tasks.list.SimpleItemRecyclerViewAdapter.onCreateViewHolder(SimpleItemRecyclerViewAdapter.java:108)
  at com.example.view.tasks.list.SimpleItemRecyclerViewAdapter.onCreateViewHolder(SimpleItemRecyclerViewAdapter.java:35)
  at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7201)
  at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6332)
  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6216)
  at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6212)
  at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2314)
  at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)
  at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
  at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
  at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4215)
  at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3615)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1204)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:723)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:760)
  at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:99)
  at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1996)
  .
  .
  .
  at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:831)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
  at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742)
  at android.view.View.measure(View.java:24545)
  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3006)

标签: androidandroid-recyclerviewrobolectric

解决方案


我遇到了同样的问题,我解决了为测试添加 @LooperMode(LooperMode.Mode.PAUSED) 的问题。


推荐阅读