Я хочу ознакомиться с рекомендациями по написанию модульных тестов, которые проверяют функции, связанные с сетевым подключением.
У меня есть класс сетевых утилит, который выполняет четыре функции
- проверяет, доступна ли сеть
- проверяет, подключено ли устройство.
- проверяет, является ли соединение wifi.
- проверяет, является ли соединение мобильным.
Вот функции вмой класс утилиты Network.
public static boolean isNetworkAvailable(@NonNull Context context) {
//check general connectivity
ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr != null) {
// active connection
return conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isConnected();
}
// no connection
return false;
}
public static boolean isConnected(@NonNull Context context) {
ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities capabilities = conMgr.getNetworkCapabilities(conMgr.getActiveNetwork());
return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
} else {
NetworkInfo info = conMgr.getNetworkInfo(conMgr.getActiveNetwork());
return (info != null && info.isConnected());
}
}
return false;
}
public static boolean isConnectedWifi(@NonNull Context context) {
ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities capabilities = conMgr.getNetworkCapabilities(conMgr.getActiveNetwork());
return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
} else {
NetworkInfo info = conMgr.getNetworkInfo(conMgr.getActiveNetwork());
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
}
return false;
}
public static boolean isConnectedMobile(@NonNull Context context) {
ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities capabilities = conMgr.getNetworkCapabilities(conMgr.getActiveNetwork());
return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
} else {
NetworkInfo info = conMgr.getNetworkInfo(conMgr.getActiveNetwork());
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
}
return false;
}
Я хотел бы написать модульные тесты для этих функций, но мне трудно манипулировать сетевым подключением, чтобы получить различные результаты (сценарии), которые я хочу протестировать.До сих пор я придумал два теста для проверки, включен ли Wi-Fi после того, как я отключил и отключил Wi-Fi.Точно так же, проверяя, включены ли мобильные данные после того, как я их отключил.
@Test
public void isWifiEnabled() {
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
wifiManager.disconnect();
assertFalse(NetworkUtils.isConnectedWifi(mContext));
}
@Test
public void isDataPlanEnabled() {
setMobileDataEnabled(mContext, false);
assertFalse(NetworkUtils.isConnectedMobile(mContext));
}
private void setMobileDataEnabled(Context context, boolean enabled) {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass;
try {
conmanClass = Class.forName(conman.getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(conman);
final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
} catch (Exception e) {
e.printStackTrace();
}
}
Как я могу проверить, доступна ли сеть?Я думал о программном включении режима полета, однако, который был отключен с 4.2.
Некоторые настройки устройства, определенные с помощью Settings.System, теперь доступны только для чтения.Если ваше приложение попытается записать изменения настроек, определенных в Settings.System, которые переместились в Settings.Global, операция записи будет молча прервана при работе на Android 4.2 и выше.Даже если ваше значение для android: targetSdkVersion и android: minSdkVersion меньше 17, ваше приложение не сможет изменять настройки, которые были перемещены в Settings.Global при работе на Android 4.2 и выше.
Как я могу проверить, доступна ли сеть, и принудительно включить / отключить состояния для модульных тестов?Или я должен игнорировать модульные тесты для этих функций?