Тестирование устройств 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 .

Intereting Posts