使用 Robolectric 3.2.1 进行 UT 时未绘制片段中的 ViewPager

ViewPager in fragment not drawn while doing UT with Robolectric 3.2.1

我正在使用 Robolectic 3.2.1 进行 UT。 我创建了一个 Activity 和一个片段,它们都只包含一个 ViewPager,如下所示:

public class ViewPagerTestActivity extends FragmentActivity {

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.viewpager_test);
  }
}

public class ViewPagerTestFragment extends Fragment {

  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
        container, @Nullable Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.viewpager_test, container, false);
      return view;
  }
 }

和布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

  <android.support.v4.view.ViewPager
      android:id="@+id/viewPager"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
  </android.support.v4.view.ViewPager>
</LinearLayout>

当我 运行

时,ViewPager 与 ViewPagerTestActivity 一起运行良好
Robolectric.setupActivity(ViewPagerTestActivity.class);

但是当我运行

SupportFragmentTestUtil.startFragment(new ViewPagerFragment());

我发现ViewPager的onDraw()和onMeasure()都没有被调用。 谁能告诉我为什么或如何使 ViewPager 被绘制到 ViewPagerTestFragment 中?

这不仅是关于 ViewPager,还有 RecyclerView 和其他子视图。

您必须模拟在屏幕上显示:

view.measure(SIZE, SIZE);
view.layout(0, 0, SIZE, SIZE);

而对于 ViewPager 项,您必须在测试中模拟它,例如:

fragment.adapter.instantiateItem(findViewPager(), 0)
Robolectric.flushForegroundThreadScheduler()