2012-11-16 10 views
6

Szenario:Android Unit Testing mit AsyncTask und UI-Updates Lösung

ich den onClick-Handler meiner Anwendung zu Unit-Test zu versuchen. Onclick führt eine einfache Suche nach einer REST-API durch, gibt die Ergebnisse zurück und aktualisiert die Benutzeroberfläche.

Details:

Onclick führt eine AsyncTask, fragt der doInBackground die REST-API und die Ergebnisse zurückgibt. Der onPostExecute übernimmt die Ergebnisse und weist dem ListView einen neuen ListAdapter mit den Daten zu.

Problem:

Die OnPostExecute bekommt durch den Test Runner nicht genannt in, da sie auf dem gleichen UI-Thread ist und blockiert den Anruf. Es gibt verschiedene Muster dafür. Wenn ich jedoch die AsyncTask in ein Runnable-Objekt einfüge und das LatchCountdown-Objekt zum Warten auf das Ergebnis verwende, erhalte ich die CalledFromWrongThread-Exception.

Gibt es eine gute Lösung zum Testen einer AsyncTask, die UI-Updates durchführt? Oder ein testbareres Design, das ich implementieren kann?

+0

Das klingt mehr wie eine ActivityInstrumentationTestCase für mich ... – dmon

+0

Dies wird in einer ActivityInstrumentationTestCase2-Klasse durchgeführt. – bcdennis72

+0

Ihre asynctask sollte gut laufen dann ... – dmon

Antwort

0

Ok laufen, so dass die Lösung kam ich mit, ist dies:

1.) Definieren Sie eine Listener-Schnittstelle für die Pre & Post Ereignisse.
2.) Implementieren Zuhörer auf Aktivität
2.) Definieren Sie eine Task-Wrapper-Klasse, die einen Hörer akzeptiert und wer hat eine innere AsyncTask, die auf ‚exec‘ genannt wird.
3.) Der innere AsyncTask benachrichtigt den Hörer auf OnPreExecute und OnPostExecute
4.) Nach Mitteilung der Aktivität aktualisiert es UI ist.

Für die Prüfung in der Aktivität:
1.) eine serielle Version der Wrapper-Klasse erstellen daraus durch vererben, dann die exec Methode überschrieben nacheinander auszuführen:
- Hörer die Aufgabe benachrichtigen, gestartet.
- die Aufgabe ausführen.
- Benachrichtigen Sie den Zuhörer, dass die Aufgabe abgeschlossen ist.

Zum Testen der asynchronen Version der Aufgabe.
1.) Verwenden eines CountdownLatch und Runnable in der Einheit Meßmethode. Da keine UI-Updates benötigt werden, haben Sie keine WrongThreadExceptions mehr.

+0

Du bist wahrscheinlich interessant bei ähnlicher Diskussion [hier] (http://stackoverflow.com/questions/10491526/how-can-i-test-the -result-of-button-click-das-ändert-die-aktivitäten-view-asy/10491965 # 10491965) und [hier] (http://stackoverflow.com/questions/8295003/best-way-to- manage-the-progressdialog-from-asynctask/8317071 # 8317071). – yorkw

0

Sie wollen den Test auf dem Ui Thread

runOnUiThread(new Runnable() { 
    public void run() { 
     onPostExecute(...) 

    } 
});