Intereting Posts
': приложение: transformClassesWithDexForDebug. > Com.android.build.transform.api.TransformException: когда я добавил последнюю версию SDK Facebook в своем проекте студии Как изменить тип viewType элемента RecyclerView onClick Подождите, пока поток не появится на Android Как удалить строку динамических символов из строки? Карты Google не отображаются на устройстве Android Очистить буфер обмена на Android Изображение с масштабированием по горизонтали с помощью переопределения не изменяет размер изображения Отправить уведомление автоматически из Firebase Как модемный код разговаривает с Android-кодом Как использовать ArrayAdapter <myClass> Применять общий onkeylistener Android обезьяна запускает NullPointerException внутри Spinner @JavascriptInterface не может быть разрешен Полезная нагрузка уведомления GCM 3.0, не отображающая уведомление об андроиде, когда приложение находится на переднем плане Android WebView getContentHeight () всегда возвращает 0

Тестирование устройств Android с помощью Junit: тестирование сетевых / bluetooth-ресурсов

Я медленно одержим единичным тестированием. Я пытаюсь разработать столько программного обеспечения, которое я могу использовать при разработке тестов. Я использую JUnit для тестирования моих приложений для Android.

Я работаю над приложением, использующим bluetooth, и мне сложно провести его тестирование. У меня есть Activity, который использует BluetoothAdapter для получения списка парных и обнаруженных устройств. Хотя он работает, я хотел бы знать, как его тестировать.

Чтобы получить список сопряженных устройств, я вызываю getBondedDevices () в экземпляре BluetoothAdapter. Проблема в том, что я не знаю, как заглушить или издеваться над этим методом (или любым другим способом bluetoothAdapter, который вызывает мои действия), поэтому я не могу проверить свою активность в отношении разных списков сопряженных устройств.

Я думал об использовании Mockito или пытается подклассировать BluetoothAdapter, чтобы каким-то образом заглушить методы, которые меня интересуют, но это последний класс, поэтому я тоже не могу этого сделать.

Любые идеи о том, как я могу тестировать программы, которые используют BluetoothAdapter или другие ресурсы, которые (насколько мне известно) трудно или невозможно заглушить или издеваться? В качестве другого примера, как бы вы протестировали программу, использующую сокеты?

Заранее благодарю за любую помощь

aleph_null

Чтобы проверить свою активность, вы можете реорганизовать свой код. Представьте BluetoothDeviceProvider с реализацией по умолчанию.

 public interface BluetoothDeviceProvider { Set<BluetoothDevice> getBluetoothDevices(); } public class DefaultBluetoothDeviceProvider implements BluetoothDeviceProvider { public Set<BluetoothDevice> getBluetoothDevices() { return new BluetoothAdapter.getDefaultAdapter().getBondedDevices(); } } 

Затем вставьте этот новый интерфейс в действие:

 public class MyActivity extends Activity { private BluetoothDeviceProvider bluetoothDeviceProvider; public MyActivity(BluetoothDeviceProvider bluetoothDeviceProvider) { this.bluetoothDeviceProvider = bluetoothDeviceProvider; } protected void onStart() { Set<BluetoothDevice> devices = bluetoothDeviceProvider.getBluetoothDevices(); ... } ... } 

Теперь активность кажется единичной. Но BluetoothDevice все еще является окончательным, и вы не можете вводить макет в свою деятельность. Поэтому вам нужно реорганизовать этот новый код и ввести новый интерфейс, который обертывает BluetoothDevice … -> слой абстракции на основных классах Android.

В конце поведение активности можно проверить с помощью различных модульных тестов … Таким образом, реализация новых интерфейсов остается проверить. Для этого вы можете:

  • Не проверяйте их (единицу), не большая проблема для меня, поскольку они просто делают делегирование

  • Посмотрите на PowerMock .

Также проверьте эту страницу вики об издевательских финальных классах с помощью PowerMock .