【问题标题】:How to make Robolectric Test for AlertDialog如何为 AlertDialog 进行 Robolectric 测试
【发布时间】:2017-12-05 14:22:09
【问题描述】:

我是 robolectric 的新手,我正在尝试对创建 AlertDialog 的按钮进行测试。单击按钮时,会生成一个带有肯定按钮的 AlertDialog,我想使用 Robolectric 单击该按钮,并测试它是否启动了活动。这是按钮的代码:

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?在此先感谢您,并希望尽快收到您的来信。

【问题讨论】:

标签: android robolectric


【解决方案1】:

我今天遇到了这个问题,不建议为了测试而公开私有函数。

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

【讨论】:

    【解决方案2】:

    让我们暂时忘记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;
    
    }
    

    那么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 会以正确的活动类名称调用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多