DialogFragmentのテスト
例えば、なんかの登録処理を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);
}
}
な感じかと