【发布时间】:2017-05-31 02:19:01
【问题描述】:
我一直在尝试弄清楚如何对我的 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”函数将需要“检索”正确的数据...并且因此会调用实际检索相应的系统数据如下:
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 可以让我模拟自己的课程。
目前我只是看不到如何测试广播接收器。此外,我不清楚我是否应该运行模拟器来执行此操作,或者只是“运行”我的单元测试,因为“影子”应该包含我需要的一切。最后,如果我要遮蔽广播接收器,我如何通过这个遮蔽过程让 WIFI 被“启用”或“禁用”?事实上,我应该模拟 BroadcastReceiver 还是只模拟 ConnectivityManager……我真的很困惑!
到目前为止,我所做的是在我的应用程序的测试部分(不是“androidTest”部分)中创建一个 BroadcastReceiverTest 类。我可以对函数进行正常的简单单元测试,我只是坚持如何模拟这种“系统”行为。
与往常一样,非常感谢任何帮助。
【问题讨论】:
-
有问题 - 为了测试 android 应用程序,您需要以特定的、可测试的方式对其进行修正。这就是为什么 MVP 和类似的技术现在非常流行的原因。
-
BroadcastReceiver 的几个问题。对于以 N 或更高版本为目标的应用程序,不推荐以 CONNECTIVITY_CHANGE 为目标。接收者也应该检查它得到的动作是它订阅的——以避免恶意请求。
标签: android unit-testing mockito robolectric android-broadcastreceiver