RobotiumでCursorアクセス

Robotiumを使ってCursorのデータを取得する方法のメモです。

Androidアプリケーションのテストを実施する場合、通常ではJUnitを使用すると思いますが、ActionBarSherlockのライブラリを導入しているとJUnit実行時に例外が発生します。ActivityInstrumentationTestCase2もしくはActivityUnitTestCaseを継承したクラスのいずれを使っても、各々異なったExceptionが出ました。

そこで、JUnitは一旦諦めて今度はNative Driverによるテストを行なってみたのですが、Activity遷移やFragmentによる画面切り替えは出来るものの、今度はListViewのリストアイテムを長押しするテストができませんでした。ググったり、Native Driverのコードを確認してみたりしましたが、Long Pressのやり方が見つからず。

そこで、Robotiumを試してみました。
http://code.google.com/p/robotium/

基本的な使い方は、Robotiumに同梱されているサンプルコードを見れば一目瞭然ですが、Cursorアクセスについてはサンプルにも記述されていなかったので自分なりにコードを書いて試してみました。以下のコードでは、テスト対象のアプリケーションにてSQLiteから取得したデータをCursorAdapterでListViewに反映しているという状況を想定しています。

public class SumpleTests extends ActivityInstrumentationTestCase2<SampleActivity > {

    private Solo mSolo;
    private SampleActivity mActivity;

    public SumpleTests(String name) {
        super(SampleActivity.class);
        setName(name);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mActivity = getActivity();
        mSolo = new Solo(getInstrumentation(), mActivity);
    }

    @Override
    protected void tearDown() throws Exception {
        try {
            mSolo.finalize();
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
        mActivity.finish();
        super.tearDown();
    }

    public void testCursor() throws Exception {

      String expected = "expected string";

      // 検査対象のListView(ここではandroid.R.id.list)を取得
      ListView lv = (ListView) mSolo.getCurrentActivity().findViewById(android.R.id.list);

      // ListViewの1行目
      Cursor c = (Cursor) lv.getItemAtPosition(0);

      // ここではCursorの2番めのカラム値を取得
      String actual = c.getString(1); 

      // テスト
      assertEquals("error message.", expected, actual);
    }
}

このような感じで、リストビューアイテムの任意のカラムの値(String型)を取得出来ます。至ってシンプルですね。