Используйте Robolectric для тестирования BluetoothAdapter в Android 4.3

В моем приложении для Android есть следующий код:

BluetoothManager bm = (BluetoothManager)activity.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter ba = bm.getAdapter();

Я хочу проводить модульные тесты с помощью Robolectric. Я использую Robolectric 2.2. Но я обнаружил, что bm равен нулю, и я не знаю, как над ним издеваться.


person Asher    schedule 26.05.2014    source источник
comment
Может быть, абстрагироваться от непроверяемого кода с помощью собственного интерфейса?   -  person Machinarius    schedule 26.05.2014
comment
Спасибо, Machinarius, я обнаружил, что getSystemService(Context.BLUETOOTH_SERVICE) — это функция по сравнению с Android 4.3, возможно, Robolectric 2.2 не поддерживает Android 4.3? Я не уверен.   -  person Asher    schedule 26.05.2014
comment
Я говорю только с точки зрения тестирования, сделайте так, чтобы тестируемый модуль зависел от чего-то, что абстрагирует Bluetooth от сложных операций, таким образом вы можете легко смоделировать интерфейс и создать реальную реализацию для производственного случая. Я раньше не пользовался bluetooth или Robolectric, поэтому не могу говорить с этой точки зрения.   -  person Machinarius    schedule 26.05.2014


Ответы (1)


Соревнование

Проблема с тестированием Bluetooth и других системных служб заключается в том, что все эти классы являются окончательными.

Трудный путь (пропустите и перейдите к решению powermock, если хотите)

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

Решение PowerMock

Однако PowerMock должен справиться с этими финальные классы. Резюме (подробнее по ссылке)

  • Используйте аннотацию @RunWith(PowerMockRunner.class) на уровне класса тестового примера.
  • Используйте аннотацию @PrepareForTest(ClassWithFinal.class) на уровне класса тестового примера.
  • Используйте PowerMock.createMock(ClassWithFinal.class) для создания фиктивного объекта для всех методов этого класса (назовем его mockObject).
  • Используйте PowerMock.replay(mockObject), чтобы изменить фиктивный объект в режим воспроизведения.
  • Используйте PowerMock.verify(mockObject), чтобы изменить фиктивный объект на режим проверки.
person hcpl    schedule 29.10.2014