如何对AlertDialog进行Robolectric测试

Eri*_*ika 3 android robolectric

我是robolectric的新手,我正在尝试对创建AlertDialog的按钮进行测试。单击该按钮后,将使用我想使用Robolectric单击的肯定按钮创建AlertDialog,并测试它是否启动活动。这是按钮的代码:

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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

有谁知道我可以测试单击肯定按钮,然后启动AvatarRoomActivity吗?在此先感谢您,希望很快能收到您的来信。

zab*_*son 7

我今天遇到了这个问题,不建议公开仅用于测试的私有函数。

Robolectric提供了一个ShadowAlertDialog,可以检测到所显示的DialogAlertDialog

//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
Run Code Online (Sandbox Code Playgroud)


thi*_*nda 5

让我们newUserButton暂时忘记吧。这与问题无关。

您需要公开该AlertDialog对象,以便可以在单元测试代码中访问它。所以我假设您的活动在 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;

}
Run Code Online (Sandbox Code Playgroud)

然后点击事件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());

}
Run Code Online (Sandbox Code Playgroud)

此测试方法验证当单击对话框的肯定按钮时,startActivityForResult是否使用正确的活动类名称进行调用。

那么剩下的问题就是我们如何确保活动真正得到解决并启动。通常我会在此时停止以测试警报对话框操作。是否可以解析意图并启动活动属性超出了此特定测试用例的范围。