我一直在试图弄清楚如何对我的BroadcastReceiver进行单元测试,我已经看过StackOverflow和其他网站,但我无法找到问题的解决方案.
在我的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'函数需要'retreive'正确的数据......并且因此会调用实际检索适当的系统数据如下:
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类.我可以对函数进行常规的简单单元测试,我只是坚持如何模拟这个'系统'行为.
一如既往,非常感谢任何帮助.