【问题标题】:How to test an AlertDialog in Android?如何在 Android 中测试 AlertDialog?
【发布时间】:2013-07-05 17:57:13
【问题描述】:

我正在尝试使用ActivityInstrumentationTestCase2 测试AlertDialog

这是原始代码:

    this.setmBtAppelerFixe(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder dialog = new AlertDialog.Builder(InterventionImmobiliereDetailsActivity.this);
            dialog.setTitle("Appel");
            dialog.setMessage("Appeler le contact ?");
            dialog.setCancelable(true);
            dialog.setNegativeButton("Non", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            dialog.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    InterventionImmobiliereDetailsActivity.this.lancerIntentAppel(mIntervention.getTelContact());
                }
            });

            mAdAppelerFixe = dialog.create();
            mAdAppelerFixe.show();
        }
    });

现在我无法点击“肯定”按钮。此代码似乎不起作用:

    mActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            assertTrue(mLLAppelerFixe.performClick());

            AlertDialog mDialog = mActivity.getAdAppelerFixe();
            assertTrue(mDialog.isShowing());

            Button okButton = mDialog.getButton(AlertDialog.BUTTON_POSITIVE);

            assertTrue(okButton.performClick());
            assertTrue(mActivity.isNumeroValide());
        }
    });

首先我在布局上单击以打开AlertDialog。 然后我得到OK_BUTTON 并单击它。它应该将 numeroValide 布尔值设置为 true。 但什么都没有。

我怎样才能简单地用按钮测试AlertDialog

【问题讨论】:

    标签: android unit-testing button click android-alertdialog


    【解决方案1】:

    这在我的 nexus 4 设备上运行良好:

    @MediumTest
    public void testStartMyActivity() {
        monitor = getInstrumentation().addMonitor(MyActivity.class.getName(), null, false);
    
        TouchUtils.clickView(this, startMyActivityButton);
    
        MyActivity myActivity = (MyActivity) monitor.waitForActivityWithTimeout(2000);
        assertNotNull("MyActivity activity not started, activity is null", myActivity);
    
        AlertDialog dialog = myActivity.getLastDialog(); // I create getLastDialog method in MyActivity class. Its return last created AlertDialog
        if (dialog.isShowing()) {
            try {
                performClick(dialog.getButton(DialogInterface.BUTTON_POSITIVE));
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    
        myActivity.finish();
        getInstrumentation().removeMonitor(monitor);
    }
    
    private void performClick(final Button button) throws Throwable {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                button.performClick();
            }
        });
        getInstrumentation().waitForIdleSync();
    }
    

    此处示例测试 AlertDialog(来自 android google 源): AlertDialogTest.java

    【讨论】:

      【解决方案2】:

      在您的原始活动中,您可以创建一个简单的方法来返回最后一个 AlertDialog 的实例。

      public AlertDialog getDialog(){
          return alertDialog;
      }
      

      在测试活动中,您可以使用以下代码访问警报对话框并单击按钮。

      ActivityMonitor monitor =  getInstrumentation().addMonitor(MyActivity.class.getName(), null, false);
      MyActivity myActivity = (MyActivity) monitor.waitForActivity();
      getInstrumentation().waitForIdleSync();    
      
      // access the alert dialog using the getDialog() method created in the activity
      AlertDialog dialog = myActivity.getDialog();
      
      // access the button
      Button okBtn = (Button) dialog.findViewById(R.id.button_ok);
      TouchUtils.clickView(this, okBtn);
      getInstrumentation().removeMonitor(monitor);
      

      【讨论】:

        【解决方案3】:

        要点击 AlertDialog 按钮,请使用 Espresso

        点击正面按钮

        onView(withId(android.R.id.button1)).perform(click());
        

        点击否定按钮

        onView(withId(android.R.id.button2)).perform(click());
        

        更多信息请访问Espresso Examples Dialog Tests

        【讨论】:

          【解决方案4】:

          您现在可以通过代码使用 Espresso

          onView(withText("South China Sea"))
            .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
            .perform(click());
          

          EspressoSamples

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-28
            • 2017-05-22
            • 2017-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多