2013-07-08 12 views
5

Ich versuche eine AlertDialog mit ActivityInstrumentationTestCase2 zu testen.Wie testen Sie einen AlertDialog in Android?

Hier ist der ursprüngliche Code:

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

Jetzt kann ich nicht verwalten auf dem positiven Knopf klicken. Dieser Code scheint nicht zu funktionieren:

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

Zuerst führe ich einen Klick auf meinem Layout die AlertDialog zu öffnen. Dann bekomme ich die OK_BUTTON und ich mache einen Klick darauf. Es sollte den numeroValide Booleschen Wert auf True setzen. Aber nichts.

Wie kann ich einfach einen AlertDialog mit Tasten testen?

Antwort

3

Dies funktioniert perfekt in meinem Nexus 4-Gerät:

@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(); 
} 

Hier Beispiel Testen Alertdialog (von android google Quelle): AlertDialogTest.java

2

In Ihrer ursprünglichen Aktivität können Sie eine einfache Methode erstellen, um die Instanz des letzten AlertDialogs zurückzugeben.

public AlertDialog getDialog(){ 
    return alertDialog; 
} 

In der Testaktivität können Sie auf den Warndialog zugreifen und mit dem folgenden Code auf die Schaltfläche klicken.

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