Модульный тест для класса сетевого обслуживания - PullRequest
0 голосов
/ 24 июня 2019

Я хочу ознакомиться с рекомендациями по написанию модульных тестов, которые проверяют функции, связанные с сетевым подключением.

У меня есть класс сетевых утилит, который выполняет четыре функции

  1. проверяет, доступна ли сеть
  2. проверяет, подключено ли устройство.
  3. проверяет, является ли соединение wifi.
  4. проверяет, является ли соединение мобильным.

Вот функции вмой класс утилиты 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 и выше.

Как я могу проверить, доступна ли сеть, и принудительно включить / отключить состояния для модульных тестов?Или я должен игнорировать модульные тесты для этих функций?

...