Android 基于BroadcastReceiver获取wifi列表的单元测试服务';s SSID和返回的Rx。可观察

Android 基于BroadcastReceiver获取wifi列表的单元测试服务';s SSID和返回的Rx。可观察,android,unit-testing,rx-java,android-testing,rx-android,Android,Unit Testing,Rx Java,Android Testing,Rx Android,我正在尝试测试我的ServiceHelper类,它提供了一个Wifi的SSID列表以显示在我的视图中。 因此,我使用RxJava+RxAndroid提供了一个可观察的。如您所见,我已选择Observable.create()从本机创建my Observable(Arraylist of Items),它取决于BroadcastReceiver内部类。 我需要测试这个方法。我不知道如何测试或模拟这种依赖于传感器的服务 public class WifiPhoneServiceHelper { p

我正在尝试测试我的ServiceHelper类,它提供了一个Wifi的SSID列表以显示在我的视图中。 因此,我使用RxJava+RxAndroid提供了一个可观察的。如您所见,我已选择Observable.create()从本机创建my Observable(Arraylist of Items),它取决于BroadcastReceiver内部类。 我需要测试这个方法。我不知道如何测试或模拟这种依赖于传感器的服务

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();
                    }
                }
            });
        }
    });
}
公共类WifiPhoneServiceHelper{
私人语境;
private ArrayList ssidList=新的ArrayList();
私有列表扫描结果列表;
私人WifiManager WifiManager;
公共WifiPhoneServiceHelper(上下文){
this.context=上下文;
}
公共可观测GetObservablesIDWifiList(){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾

public void call(final Subscriber为了单元测试您的代码,您需要将所有功能描述到单独的接口中,然后为Android实现它,并为单元测试创建模拟实现(Mockito).

Alex有效地建议您在代码和Wi-Fi系统之间创建一个接口,在生产代码中由Android的WifiManager实现,但在测试中,由您自己的测试工具实现

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

特别是寻找基于周围的例子。谜题的另一半是生成事件广播来刺激代码,但这也应该是可行的


完全描述机器人测试环境的建立超出了本回答的范围,但希望这能让您开始研究。

因此,我可以使用真正的Android手机设备真正测试提供的Wifi SSID列表?我的意思是,我能做些什么来不在运行时测试整个应用程序…我想要o使用SDKNo中的android API测试所提供的WIFI ssid列表,java机器上运行的单元测试,在android上使用插入式测试进行测试。通过这样做,您将了解AndroidOk的真实上下文,因此我如何使用插入式测试来列出WIFI ssid列表?我找不到一个有效的示例…可能是因为其他测试专家…你能发布一个测试代码链接吗?提前感谢…项目默认情况下有空的插入测试,请参阅androidTest folderThank you,所以我需要将此工作分为两个步骤:步骤1:我必须使用一个名为接口IwifidProvider的接口{ArrayList provideSsidWifiList(上下文);}然后在我的getObservalessidWifiList()中使用它的真实实现-第二步是使用Robotelectics的ShadowWifiManager模拟wifi系统。但是如果我真的想确定这段代码真的提供了一个SSID列表,并且在运行时不会崩溃,那该怎么办呢?有没有办法用一个真正的设备来测试它,例如使用仪器化测试?非常感谢!我们描述的不是两个步骤,而是床上有两种不同的可能性。你不需要把它连接起来(步骤1)如果你使用的是Robolectric。但是如果你想在真实网络上的真实设备上进行测试,你实际上需要第三种选择,那就是在插装下运行真实的代码——几乎只是对现有代码的普通单元测试,但使用的是一个设备。有很多资料描述了如何在Android上进行插装测试。谢谢你罗布,现在我看清楚了,请写一些有用的链接,这样我就可以完成这个对话了。:)