2010-03-02 15 views
10

Próbuję przetestować działanie w Androidzie, które pokaże ProgressDialog i wszystko działa poprawnie w aplikacji, jednak gdy spróbuję użyć ActivityUnitTestCase, a test powoduje, że działanie pokazuje okno dialogowe, to się nie uda z tego błędu:Okno dialogowe testowania w Aktywności AndroidaUnitTestCase

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) 

szukałem na problem i wydaje się, że metoda onCreateDialog moich wypadków aktywności, gdy staramy się stworzyć go z testu, które zakładam, że jest inny kontekst, mam, że jednak Zastanawiam się, czy któryś z was odniósł sukces próbując takiego scenariusza.

To jest kod mojego 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; 
} 

Wszelkie pomysły?

Odpowiedz

2

Znajduję sposób, aby to zrobić, wierzę.

Problem polegał na tym, że musiałem przedłużyć działanie ActivityInstrumentationTestCase2, a także zrobić to, aby uniknąć problemów z wątkiem GUI.

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

Moje jedyne pytanie brzmi: jak sprawdzić wyniki, ponieważ muszę sprawdzić, w którym działaniu wylądowałem i jakie dodatki?

+1

Hm, to naprawdę nie jest rozwiązanie? AITC2 służy do realizacji pełnych testów end-to-end, a nie testów jednostkowych. Nie widzę żadnego dobrego powodu, dla którego nie można by przetestować dialogów w teście jednostkowym. (PS: Mam ten sam problem! Chociaż używam AlertDialog.Builder, przypadek testowy zawiesza się w dialog.show) – Matthias

+0

Domyślam się, że AUTC nie ma prawdziwego 'okna' do dołączenia' Dialog' do ; "Kontekst", w którym uruchomiony jest test bez przyrządu, nie jest prawdziwy. Mogę polecić Robotium do potwierdzenia obecności i zawartości Dialogów, ale to zależy od oprzyrządowania testowego. –

+2

Ten problem polega na śledzeniu problemu z tworzeniem okien dialogowych za pomocą funkcji ActivityUnitTestCase http://code.google.com/p/android/issues/detail?id=14616 – ThomasW