基于BroadcastReceiver对服务进行单元测试,获取wifi的SSID列表并返回Rx.Observable



我正在尝试测试我的ServiceHelper类,该类别提供了WiFi的SSID列表,可以在我看来显示。因此,我正在使用RXJAVA RXANDROID提供可观察的。如您所见,我选择了observable.create()从本机中创建我可观察的(物品的arraylist)巫婆的依赖于广播的内在类。我需要测试此方法。我对如何测试或嘲笑这种取决于传感器的服务没有一个好主意。

public class WifiPhoneServiceHelper {
private Context context;
private ArrayList<String> ssidList = new ArrayList<>();
private List<ScanResult> scanResultList;
private WifiManager wifiManager;
public WifiPhoneServiceHelper(Context context) {
    this.context = context;
}
public Observable<ArrayList<String>> getObservableSsidWifiList() {
    return Observable.create(new Observable.OnSubscribe<ArrayList<String>>() {
        @Override
        public void call(final Subscriber<? super ArrayList<String>> subscriber) {
            wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            final BroadcastReceiver receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                        scanResultList = wifiManager.getScanResults();
                        for (int i = 0; i < scanResultList.size(); i++) {
                            String ssidDetected = scanResultList.get(i).SSID;
                            ssidList.add(ssidDetected);
                        }
                        subscriber.onNext(ssidList);
                    }
                }
            };
            context.registerReceiver(receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
            if (!wifiManager.isWifiEnabled()) {
                wifiManager.setWifiEnabled(true);
            }
            wifiManager.startScan();
            subscriber.add(new MainThreadSubscription() {
                @Override
                protected void onUnsubscribe() {
                    context.unregisterReceiver(receiver);
                    Timber.d("unregisterReceiver BroadcastReceiver SCAN_RESULTS_AVAILABLE_ACTION");
                    if (!subscriber.isUnsubscribed()) {
                        subscriber.unsubscribe();
                    }
                }
            });
        }
    });
}

为了单位测试您的代码,您需要将所有功能描述为单独的接口,然后为Android实现并为单位测试创建模拟实现(Mockito)。

alex有效地建议您在代码和Wi-Fi系统之间创建一个接口,并且在生产代码中已由Android的Wifimanager实施,但是在测试中,由您自己的测试线束实现。。

您当然可以这样做,但是另一种选择是robolectric。这是一个Android单元测试框架,可用于模拟Android系统的大部分,而无需进行Mockito尽可能多的基础工作。具体而言,它可以模拟Wi-Fi系统,因此您可以假装存在或不存在一个给定的网络。这是您的优点,您可以在很大程度上使用代码来保持Wi-Fi,而无需重构进行测试,但是您仍然不需要真实的设备,并且不依赖于现实世界的网络环境。

特别是寻找基于Shadowwifimanager的示例。另一半拼图正在制作活动广播以刺激您的代码,但这也应该是可行的。

完全描述了一个roboleclectric测试环境的范围,但希望您能为您开始研究。

最新更新