2010-11-01 18 views
11

也許我錯過了一些東西。我想爲BroadcastReceiver編寫測試用例;具體來說,它用於接收BOOT_COMPLETED事件併爲另一個接收器設置一個警報以供稍後處理;它似乎沒有正確設置,但重點是我沒有明顯的方式來測試它。我無法準確連接調試器並等待BOOT_COMPLETED,也無法發送假的BOOT_COMPLETED廣播。爲什麼沒有用於BroadcastReceiver的測試儀器?

爲什麼有活動,服務和提供程序的檢測類,但不是BroadcastReceiver?任何測試這個建議?

回答

18

BroadcastReceiver的生命週期沒有什麼神奇的。用一個AndroidTestCase進行測試就足夠了。在測試用例中,實例化您的BroadcastReceiver,創建您想要發送的Intent,並使用AndroidTestCase提供的Context或某些模擬上下文調用onReceive。

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

簡單,沒有工作! – Robert 2015-04-13 20:36:28

7

在大多數情況下我與https://stackoverflow.com/a/5181010/527016

完全一致然而有情況下,當延伸AndroidTestCase是不合適的(和可能導致的意外)。特別是,如果您正在進行更復雜的集成測試,並且想要使用系統發送的實際Intent來測試BroadcastReceiver。主要原因是廣播接收機中的onReceive方法在主應用程序線程上運行,而AndroidTestCase中的測試運行在另一個線程中。這可能會導致代碼中與測試相關的線程問題不能在多線程上運行。

解決方案是從InstrumentationTestCase代替您的測試的子類,並使用@UiThreadTest註釋使測試在與onReceive方法相同的線程上運行。

欲瞭解更多信息(和示例),請參閱:http://olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html

相關問題