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

时间:2017-08-03 07:43:21

标签: android android-viewpager robolectric

我正在使用Robolectic 3.2.1做UT。 我创建了一个Activity和一个Fragment,它们只包含一个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中绘制?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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