2010-03-02 8 views
10

Sto provando a testare un'attività in Android che mostrerà una ProgressDialog e tutto funziona correttamente nell'app, tuttavia quando provo a utilizzare ActivityUnitTestCase e il test fa sì che l'attività mostri la finestra di dialogo che fallisce con questo errore:Testing dialog in ActivityUnitTestCase di Android

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
at android.view.ViewRoot.setView(ViewRoot.java:429) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:178) 
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
at android.view.Window$LocalWindowManager.addView(Window.java:392) 

stavo guardando il problema e sembra che il metodo onCreateDialog dei miei arresti di attività quando cerchiamo di crearlo dal test, che presumo è un altro contesto, l'ho capito, però Mi chiedo se qualcuno di voi abbia avuto successo nel provare un simile scenario.

Questo è il codice del mio onCreateDialog.

public Dialog onCreateDialog(final int id) 
{ 
    Dialog dialog; 
    switch (id) 
    { 
     case PROGRESS_BAR: 
      loadingDialog = new ProgressDialog(this); 
      loadingDialog.setMessage("searching for product..."); 
      loadingDialog.setIndeterminate(true); 
      dialog = loadingDialog; 
      break; 
     case INEXISTING_PRODUCT: 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("Product not found"); 
      builder.setPositiveButton("OK", null); 
      dialog = builder.create(); 
      break; 
     case UNAVAILABLE_SERVICE: 
      AlertDialog.Builder unavailableBuilder = new AlertDialog.Builder(this); 
      unavailableBuilder.setMessage("Service Unavailable"); 
      unavailableBuilder.setPositiveButton("OK", null); 
      dialog = unavailableBuilder.create(); 
      break; 
     default: 
      dialog = super.onCreateDialog(id); 
    } 
    return dialog; 
} 

Qualche idea?

risposta

2

Trovo un modo per farlo, credo.

Il problema era che dovevo estendere da ActivityInstrumentationTestCase2 e fare anche questo per evitare problemi con il thread della GUI.

final Button uButton = (Button) activity.findViewById(R.id.btnSearchProduct); 
    activity.runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      uButton.performClick(); 
     } 
    }); 

La mia unica domanda è come controllare i risultati, dal momento che ho bisogno di sapere in quali attività sono atterrato ed è extra?

+1

Hm, non è proprio una soluzione? AITC2 viene utilizzato per implementare test end-to-end completi, non test unitari. Non vedo alcuna buona ragione per cui uno non sarebbe in grado di testare i dialoghi in un test unitario. (PS: Sto avendo lo stesso problema! Anche se uso AlertDialog.Builder, il test case si blocca in dialog.show) – Matthias

+0

Direi che un AUTC non ha una vera 'Finestra' per collegare il' Dialog' a ; il 'Contesto' all'interno del quale è in esecuzione un test non strumentato non è reale. Posso consigliare Robotium per confermare la presenza e il contenuto dei Dialoghi, ma ciò dipende da un caso di test strumentato. –

+2

Questo problema sta monitorando il problema con la creazione di finestre di dialogo con ActivityUnitTestCase http://code.google.com/p/android/issues/detail?id=14616 – ThomasW