Подтвердить что ты не робот

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

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

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

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

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

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

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

aleph_null

4b9b3361

Ответ 1

Чтобы проверить свою активность, вы можете реорганизовать свой код. Внесите 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.

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