我一直在試圖弄清楚如何單元測試我的BroadcastReceiver,我看了看StackOverflow和其他網站,但我找不到解決我的問題。單元測試BroadcastReceiver
在我mainActivity我有以下兩個功能:
private void registerNetRcvr(){
if (!isRcvrRegistered) {
isRcvrRegistered = true;
registerReceiver(receiver, new IntentFilter("android.net.wifi.STATE_CHANGE"));
registerReceiver(receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
NetworkHandler.NetworkInfo netInfo = NetworkHandler.handleBcastReceiver(context);
if (netInfo!=null){
handleInfoChange(netInfo);
} else {
handleInfoChange(null);
}
}
};
的registerNetRcvr從的onResume函數中調用(和同樣我有在onPause稱爲註銷)。
從上面可以看出,我有一個函數(handleBcastReceiver)被調用來處理onReceive事件,因此有另一個類,然後有從這個函數調用的各種私有函數。
只是稍微複雜一點... onreceive函數被調用,如上所述,'handleBcastReceiver'函數然後將需要'檢索'正確的數據......並且因此將實際調用檢索合適的系統中的數據,如下所示:
private static NetworkInfo getWiFiNetworkInfo(Context context) {
ConnectivityManager connManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
}
我相信,我應該效仿的onReceive的回調行爲,而且我想效仿將從系統調用getWiFiNetworkInfo期間返回。
我的想法是,我應該使用RoboElectric來做到這一點,因爲它可以影響BroadcastReceiver/ConnectivityManager。我也看過Mockito,但我相信RoboElectric是我所需要的,但我相信我很可能是錯的。據我所知,RoboElectric允許我模擬'Android系統',Mockito允許我模擬自己的課程。
目前我只是看不到如何測試BroadcastReceiver。此外,我不清楚我是應該運行模擬器來執行此操作,還是僅僅'運行'我的單元測試,因爲'影子'應該包含我需要的所有內容。最後,如果我想影響BroadcastReceiver,我怎麼通過這個陰影過程使WIFI'啓用'或'禁用'?事實上,我應該模擬一個BroadcastReceiver還是僅僅連接管理器...我真的很困惑!
我到目前爲止所做的是在我的應用程序的測試部分(而不是'androidTest'部分)內創建BroadcastReceiverTest類。我可以對函數進行正常的簡單單元測試,我只是在模仿這個「系統」行爲而堅持。
一如既往,非常感謝任何幫助。
存在問題 - 爲了測試Android應用程序,你需要在特定的,可測試的方式來糾正它。這就是爲什麼現在MVP和技術很受歡迎的原因。 – Divers