ViewPager(FragmentPagerAdapter)のテスト

2013-07-04T00:00:00+00:00 Android Java

ViewPager(+FragmentPagerAdapter)を使っている際に、Activityのテスト(ActivityInstrumentalTestCase2)でViewPagerで利用されているFragmentPagerAdapterを取って、そのFragmentを取得してごにょごにょテストする方法

で要件として

  • ActivityからViewPagerなインスタンスを取る
  • ViewPagerからFragmentPagerAdapterなインスタンスを取る
  • FragmentPagerAdapterから利用されているFragmentのインスタンスを取る (このFragmentはListFrament)

っていう所。んまぁActivityとかFragmentとかAdapterなソースは省略

package kinjouj.sample.feedreader.test;

import java.sql.SQLException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.widget.ListAdapter;
import kinjouj.sample.feedreader.Feed;
import kinjouj.sample.feedreader.FeedDao;
import kinjouj.sample.feedreader.FeedListFragment;
import kinjouj.sample.feedreader.FeedUtils;
import kinjouj.sample.feedreader.MainActivity;
import kinjouj.sample.feedreader.R;

import static org.hamcrest.Matchers.*;

// BaseActivityTestCaseはActivityInstrumentalTestCase2を継承した抽象クラス
public class MainActivityTestCase extends BaseActivityTestCase<MainActivity> {

    public MainActivityTestCase() {
        super(MainActivity.class);
    }

    // setUpメソッドは省略

    public void test_onCreate() throws Exception {
        getInstrumentation().waitForIdleSync();

        MainActivity activity = (MainActivity)getActivity();
        assertThat(activity, notNullValue());

        ViewPager viewPager = (ViewPager)activity.findViewById(R.id.view_pager);
        assertThat(viewPager, notNullValue());

        FragmentPagerAdapter pagerAdapter = (FragmentPagerAdapter)viewPager.getAdapter();
        assertThat(pagerAdapter, notNullValue());

        ListFragment fragment = (ListFragment)pagerAdapter.instantiateItem(
            viewPager,
            viewPager.getCurrentItem()
        );
        assertThat(fragment, notNullValue());
        assertThat(fragment, instanceOf(FeedListFragment.class));
    }
}

FragmentPagerAdapterではgetItemメソッドを使って、Fragmentのインスタンスを生成すると思うのでだけれども、その生成されたインスタンスを取得するのであればinstantiateItemメソッドを利用する事で可能な模様

という感じでViewPager(+FragmentPagerAdapter)を使うにあたってのテストはこんな感じかなーっと

ちなみに、FragmentPagerAdapterじゃなくてPagerAdapterだったらinstantiateItemでビューの初期化を行うっていうのがデフォなのかも知れないのでそのケースではこれは使えないかと

PullToRefresh(ListFragment)#onRefreshをTouchUtilsでテストする PullToRefreshのヘッダー?部に表示される矢印を消す方法