2013-07-08 17 views
5

Sto provando a testare un AlertDialog con ActivityInstrumentationTestCase2.Come testare un AlertDialog in Android?

Ecco il codice originale:

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

Ora non riesco a fare clic sul pulsante positivo. Questo codice non sembra funzionare:

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

Per prima cosa ho eseguire un clic sul mio layout per aprire la AlertDialog. Poi ho il OK_BUTTON e faccio un clic su di esso. Dovrebbe impostare il valore booleano numeroValide true. Ma niente.

Come posso semplicemente testare uno AlertDialog con i pulsanti?

risposta

3

Questo è perfettamente funzionante nel mio dispositivo 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(); 
} 

Qui esempio testare AlertDialog (da fonte Google Android): AlertDialogTest.java

0

È possibile utilizzare Espresso per ora con il codice di

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

Vedi EspressoSamples

2

Nell'attività originale è possibile creare un metodo semplice per restituire l'istanza dell'ultimo Dialogo di avviso.

public AlertDialog getDialog(){ 
    return alertDialog; 
} 

Nell'attività di test è possibile accedere alla finestra di dialogo di avviso e fare clic sul pulsante utilizzando il seguente codice.

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