DialogFragmentのテスト

2013-05-21T00:00:00+00:00 Android Java

例えば、なんかの登録処理をAlertDialogで表示させてsetViewでフォーム的なのをビューとして利用、そのAlertDialog自体はDialogFragmentで生成される。でそれのテストをどうやるのかって所なんですが、DialogFragmentはレイアウトにIDとか含まれず

AddFormDialogFragment fragment = new AddFormDialogFragment();
fragment.show(getSupportFragmentManager(), "add_form_fragment");

的な感じで使ってる場合にそのUIの振る舞いな処理をテストするにはって所なんですが

package kinjouj.sample.test;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.support.v4.app.Fragment;
import android.test.SingleLaunchActivityTestCase;
import android.test.TouchUtils;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import kinjouj.sample.AddFormDialogFragment;
import kinjouj.sample.MainActivity_;

public class MainActivityTestCase extends SingleLaunchActivityTestCase<MainActivity_> {

    private MainActivity_ mActivity;

    public MainActivityTestCase() {
        super("kinjouj.sample", MainActivity_.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        mActivity = getActivity();
    }

    public void test_onMenuAdd() throws Throwable {
        // メニューな所をクリックする処理でも良いのはと。今回はAcitvityなメソッドをそのまま実行
        runTestOnUiThread(new Thread() {
            @Override
            public void run() {
                mActivity.onMenuAdd();
            }
        });
        getInstrumentation().waitForIdleSync();

        // Activity側で指定したDialogFragmentのタグからFragmentなインスタンスを取る。んでもってAddFormDialogFragmentかを検査
        Fragment dialogFragment = mActivity
            .getSupportFragmentManager()
            .findFragmentByTag("add_form_fragment");
        assertNotNull(dialogFragment);
        assertTrue(dialogFragment instanceof AddFormDialogFragment);

        // 出ているダイアログを取得。AlertDialogかの検査
        Dialog dialog = ((AddFormDialogFragment)dialogFragment).getDialog();
        assertNotNull(dialog);
        assertTrue(dialog instanceof AlertDialog);

        // AlertDialogのOKボタン(POSITIVE_BUTTON)を取得
        Button dialogPositiveButton = ((AlertDialog)dialog)
            .getButton(DialogInterface.BUTTON_POSITIVE);

        // DialogにsetViewされているViewを取得。EditTextであるかの検査
        View editTextView = dialog.findViewById(kinjouj.sample.R.id.name_text);
        assertNotNull(editTextView);
        assertTrue(editTextView instanceof EditText);

        final EditText editText = (EditText)editTextView;

        // ダイアログに出ているEditTextに値をぶち込む
        runTestOnUiThread(new Thread() {
            @Override
            public void run() {
                editText.setText("test_onMenuAdd");
            }
        });
        getInstrumentation().waitForIdleSync();

        // ぶち込まれたテキストが空では無いのを検査
        assertFalse(TextUtils.isEmpty(editText.getText()));

        // 処理される前のListAdapterのサイズを取っておく
        int beforeSavedSize = mActivity.getFragment().getListAdapter().getCount();

        // DialogInterface.POSITIVE_BUTTONをクリック
        TouchUtils.tapView(this, dialogPositiveButton);

        // 処理された後のListAdapterなサイズを検査
        int afterSavedSize = mActivity.getFragment().getListAdapter().getCount();
        assertTrue(afterSavedSize > beforeSavedSize);
        assertTrue(afterSavedSize == beforeSavedSize + 1);
    }
}

な感じかと

Androidでmockito+hamcrestを使うとエラーになる件 ActionBarSherlockとSlidingMenuなテスト