2010-11-01 14 views
11

Vielleicht vermisse ich etwas. Ich möchte Testfälle für einen BroadcastReceiver schreiben; Insbesondere dient es zum Empfangen des Ereignisses BOOT_COMPLETED und zum Einstellen eines Alarms, den ein anderer Empfänger später behandeln soll; es scheint nicht richtig eingestellt zu sein, aber der Punkt ist, dass ich keine offensichtliche Möglichkeit habe, es zu testen. Ich kann nicht genau einen Debugger anhängen und auf BOOT_COMPLETED warten, und ich kann keine gefälschte BOOT_COMPLETED Sendung senden.Warum gibt es keine Testinstrumentierung für BroadcastReceiver?

Warum gibt es Instrumentierungsklassen für Aktivität, Service und Provider, aber nicht BroadcastReceiver? Irgendwelche Tipps zum Testen?

Antwort

18

Es gibt nichts Magisches über den Lebenszyklus für den BroadcastReceiver. Es genügt, es mit einem AndroidTestCase zu testen. In einem Testfall instanziieren Sie Ihren BroadcastReceiver, erstellen Sie den gewünschten Intent, den Sie senden möchten, und rufen Sie onReceive auf, indem Sie den von AndroidTestCase verfügbaren Kontext oder einen falschen Kontext verwenden.

z.

public class TestMyBroadcastReceiver extends AndroidTestCase { 
    public void testReceive() { 
    MyBroadcastReceiver r = new MyBroadcastReceiver(); 
    Intent i = new Intent("MY_ACTION"); 
    // TODO put extras 
    r.onReceive(getContext(), i); 
    // TODO query application state to verify results 
    } 
} 
+0

Einfach und macht den Job! – Robert

7

Für die meisten Fälle stimme ich völlig mit https://stackoverflow.com/a/5181010/527016

Es gibt jedoch Fälle, in denen AndroidTestCase verlauf nicht geeignet ist (und kann Überraschungen verursachen). Insbesondere, wenn Sie komplexere Integrationstests durchführen und Ihre BroadcastReceiver mit einer tatsächlichen Intent vom System gesendet testen möchten. Der Hauptgrund dafür ist, dass die Methode onReceive im Broadcast-Empfänger auf dem Hauptanwendungs-Thread ausgeführt wird, während die Tests in AndroidTestCase in einem anderen Thread ausgeführt werden. Dies kann testbezogene Threading-Probleme in Code verursachen, der nicht für mehrere Threads ausgeführt werden sollte.

Die Lösung hierfür ist, Ihren Test von InstrumentationTestCase stattdessen Unterklasse und verwenden Sie die @UiThreadTest Annotation, um die Tests auf dem gleichen Thread wie die onReceive Methode ausgeführt werden.

Für weitere Informationen (und ein Beispiel): http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html

Verwandte Themen