我正在尝试测试我的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测试环境的范围,但希望您能为您开始研究。