2013-07-08 24 views
5

我想測試一個AlertDialogActivityInstrumentationTestCase2如何測試Android中的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

回答

3

這在我的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源): AlertDialogTest.java

0

您可以使用咖啡現在與代碼

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

請參閱EspressoSamples

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);