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

标签 android unit-testing rx-java android-testing rx-android

我正在尝试测试我的 ServiceHelper 类,该类提供了要在我的 View 中显示的 Wifi SSID 列表。 所以我使用 RxJava + RxAndroid 提供一个可观察的。正如您所看到的,我选择了 Observable.create() 从 native 创建我的可观察对象(项目的数组列表),它依赖于 BroadcastReciever 内部类。 我需要测试这个方法。我不太清楚如何测试或模拟这种依赖于传感器的服务。

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();
                    }
                }
            });
        }
    });
}

最佳答案

为了对代码进行单元测试,您需要将所有功能描述到单独的接口(interface)中,然后针对 Android 实现它并为单元测试创​​建模拟实现 (Mockito)。

关于android - 基于 BroadcastReceiver 获取 wifi SSID 列表并返回 Rx.Observable 的服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223825/

相关文章:

android - 如何根据另一个项目调整撰写列中项目的大小

unit-testing - 开放测试格式?

android - 将所有 android 测试(单元/集成/UI 测试)放入单个测试项目中是最佳做法吗?

c# - 断言包含匿名类型的 JsonResult

android - TERMUX-bash : ./a.out:权限被拒绝

android - 没有 SDK 实现的 OneSignal Android 通知

java - 如何从 Observable 返回值到 Rxjava 2

android - RxJava 主题的真实世界用例

java - 机器人 : tabhost not rendering tabs

android - 如何使用 RxJava2 创建 2 个或两个并行网络请求?