2010-11-01 11 views
11

Forse mi manca qualcosa. Voglio scrivere casi di test per un BroadcastReceiver; in particolare, è per ricevere l'evento BOOT_COMPLETED e impostare un allarme per un altro ricevitore da gestire in un secondo momento; non sembra configurarlo correttamente, ma il punto è che non ho un modo ovvio per testarlo. Non riesco a collegare esattamente un debugger e aspetto BOOT_COMPLETED e non riesco a inviare una falsa trasmissione BOOT_COMPLETED.Perché non esiste una strumentazione di test per BroadcastReceiver?

Perché esistono classi di strumentazione per attività, servizio e provider, ma non BroadcastReceiver? Qualche consiglio per testarlo?

risposta

18

Non c'è nulla di magico nel ciclo di vita di BroadcastReceiver. Basta testarlo con un AndroidTestCase. In un test case, crea un'istanza di BroadcastReceiver, crea l'Intent che vuoi inviare e chiama onReceive usando il Context disponibile da AndroidTestCase o qualche contest di simulazione.

E.g.

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

semplice e fa il lavoro! – Robert

7

Per la maggior parte dei casi sono completamente d'accordo con https://stackoverflow.com/a/5181010/527016

Ci sono tuttavia casi in cui si estende AndroidTestCase non è adatto (e può causare sorprese). In particolare, se si stanno eseguendo test di integrazione più complessi e si desidera testare il numero BroadcastReceiver con un effettivo Intent inviato dal sistema. Il motivo principale è che il metodo onReceive nel ricevitore broadcast viene eseguito sul thread dell'applicazione principale mentre i test in AndroidTestCase vengono eseguiti in un altro thread. Ciò può causare problemi di thread relativi al test nel codice che non era destinato a essere eseguito su più thread.

La soluzione a questo è alla sottoclasse il test da InstrumentationTestCase invece e utilizzare il @UiThreadTest annotazioni per rendere le prove eseguite sullo stesso filo come metodo onReceive.

Per ulteriori informazioni (e un esempio) si veda: http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html

Problemi correlati