如何对 AlertDialog 进行 Robolectric 测试
How to make Robolectric Test for AlertDialog
我是 robolectric 的新手,我正在尝试对创建 AlertDialog 的按钮进行测试。单击该按钮时,会生成一个带有正按钮的 AlertDialog,我想使用 Robolectric 单击该按钮并测试它是否启动 activity。这是按钮的代码:
newUserButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
builder.setTitle(context.getResources().getString(R.string.start_title_message))
.setMessage(getResources().getString(R.string.start_dialog_message));
builder.setPositiveButton(getString(R.string.start_confirm_message), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
startActivityForResult(new Intent(StartActivity.this, AvatarRoomActivity.class), 0);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
ColorDrawable drawable = new ColorDrawable(Color.WHITE);
drawable.setAlpha(200);
dialog.getWindow().setBackgroundDrawable(drawable);
dialog.show();
}
});
有谁知道如何测试单击肯定按钮,然后启动 AvatarRoomActivity?在此先感谢并希望尽快收到某人的来信。
让我们暂时忘记 newUserButton
。与问题无关。
您需要公开 AlertDialog
对象,以便可以在单元测试代码中访问它。所以我假设你 activity 在 StartActivity 中有这样一个方法:
AlertDialog showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
builder.setTitle("This is title")
.setMessage("Dialog Message");
builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
startActivityForResult(new Intent(this, AvatarRoomActivity.class), 0);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
return dialog;
}
那么newUserButton
的点击事件就调用这个方法
然后我们有这样的测试用例:
@Test
public void testLaunchAvatarRoomWhenConfirm() {
StartActivity startActivity = Robolectric.buildActivity(StartActivity.class).create().get();
AlertDialog dialog = startActivity.showDialog();
// Key part 1 : simulate button click in unit test
Button confirm = dialog.getButton(Dialog.BUTTON_POSITIVE);
confirm.performClick();
// Key part 2 : Check that startActivityForResult is invoke
ShadowActivity shadowActivity = shadowOf(startActivity);
ShadowActivity.IntentForResult intentForResult = shadowActivity.getNextStartedActivityForResult();
// assert that the proper request to start activity is sent
ComponentName nextActivity = intentForResult.intent.getComponent();
assertEquals(".AvatarRoomActivity", nextActivity.getShortClassName());
}
此测试方法验证当单击对话框的肯定按钮时,startActivityForResult
会以正确的 activity class 名称调用。
所以剩下的问题就是我们如何确保 activity 真正解决并启动。通常我会在此时停止以测试警报对话框操作。是否可以解决意图并开始 activity 属性 超出了这个特定测试用例的范围。
我今天遇到了这个问题,不建议仅仅为了测试而暴露私有函数。
Robolectric提供了一个ShadowAlertDialog
,可以检测显示的Dialog
或AlertDialog
.
//get all shown dialogs
ShadowAlertDialog.getShownDialogs()
//get single dialog
(ShadowAlertDialog.getLatestDialog() as android.support.v7.app.AlertDialog)
.getButton(AlertDialog.BUTTON_POSITIVE)
.performClick()
//Continue the test
我是 robolectric 的新手,我正在尝试对创建 AlertDialog 的按钮进行测试。单击该按钮时,会生成一个带有正按钮的 AlertDialog,我想使用 Robolectric 单击该按钮并测试它是否启动 activity。这是按钮的代码:
newUserButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
builder.setTitle(context.getResources().getString(R.string.start_title_message))
.setMessage(getResources().getString(R.string.start_dialog_message));
builder.setPositiveButton(getString(R.string.start_confirm_message), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
startActivityForResult(new Intent(StartActivity.this, AvatarRoomActivity.class), 0);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
ColorDrawable drawable = new ColorDrawable(Color.WHITE);
drawable.setAlpha(200);
dialog.getWindow().setBackgroundDrawable(drawable);
dialog.show();
}
});
有谁知道如何测试单击肯定按钮,然后启动 AvatarRoomActivity?在此先感谢并希望尽快收到某人的来信。
让我们暂时忘记 newUserButton
。与问题无关。
您需要公开 AlertDialog
对象,以便可以在单元测试代码中访问它。所以我假设你 activity 在 StartActivity 中有这样一个方法:
AlertDialog showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(StartActivity.this);
builder.setTitle("This is title")
.setMessage("Dialog Message");
builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
startActivityForResult(new Intent(this, AvatarRoomActivity.class), 0);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
return dialog;
}
那么newUserButton
的点击事件就调用这个方法
然后我们有这样的测试用例:
@Test
public void testLaunchAvatarRoomWhenConfirm() {
StartActivity startActivity = Robolectric.buildActivity(StartActivity.class).create().get();
AlertDialog dialog = startActivity.showDialog();
// Key part 1 : simulate button click in unit test
Button confirm = dialog.getButton(Dialog.BUTTON_POSITIVE);
confirm.performClick();
// Key part 2 : Check that startActivityForResult is invoke
ShadowActivity shadowActivity = shadowOf(startActivity);
ShadowActivity.IntentForResult intentForResult = shadowActivity.getNextStartedActivityForResult();
// assert that the proper request to start activity is sent
ComponentName nextActivity = intentForResult.intent.getComponent();
assertEquals(".AvatarRoomActivity", nextActivity.getShortClassName());
}
此测试方法验证当单击对话框的肯定按钮时,startActivityForResult
会以正确的 activity class 名称调用。
所以剩下的问题就是我们如何确保 activity 真正解决并启动。通常我会在此时停止以测试警报对话框操作。是否可以解决意图并开始 activity 属性 超出了这个特定测试用例的范围。
我今天遇到了这个问题,不建议仅仅为了测试而暴露私有函数。
Robolectric提供了一个ShadowAlertDialog
,可以检测显示的Dialog
或AlertDialog
.
//get all shown dialogs
ShadowAlertDialog.getShownDialogs()
//get single dialog
(ShadowAlertDialog.getLatestDialog() as android.support.v7.app.AlertDialog)
.getButton(AlertDialog.BUTTON_POSITIVE)
.performClick()
//Continue the test