Модульное тестирование Android и интерфейсы

1

У меня возникла небольшая проблема с внедрением модульного тестирования на Android. В качестве простого теста я пытался сопоставить строку, полученную из строковых ресурсов:

String myString = myActivity.getResources().getString(R.string.testString));

Однако при модульном тестировании это неизменно приводит к исключению нулевого указателя. Это включает в себя robolectric, а также реализацию Junit, поставляемую с Android sdk.

Одним из возможных решений является подход к поиску ресурсов способом, подобным объекту доступа к данным. То есть, создайте интерфейс, через который будут доступны доступ к строковым ресурсам. Это позволило бы мне высмеять доступ к строковому ресурсу. Точно так же я мог бы отделить не-андроидное зависимое поведение, скажем, Activity, от отдельного класса pojo. Это позволило бы мне запускать модульные тесты с использованием стандартных инструментов тестирования Java. Фактически, я мог бы делегировать любую связанную с инфраструктурой Android инфраструктуру для интерфейса.

Это похоже на много прыжков через обручи, чтобы получить модульное тестирование. Стоит ли оно того? Существует ли более жизнеспособный подход?

Теги:
unit-testing

2 ответа

2
Лучший ответ

Оказалось, проблема заключалась в том, что деятельность должна быть получена в реальном методе тестирования. Так, например, мой метод теперь выглядит следующим образом:

public void testGetActivityResourceString() {

    Activity myActivity = this.getActivity();
    String myString = myActivity.getResources().getString(R.string.hello);
    Assert.assertNotNull(myString);
}

В то время как до создания активности в настройке. Это предложение было в документах:

"Для каждого вызова метода метода действие фактически не будет создано до тех пор, пока не будет вызван этот метод."

Это была настоящая хлопот, чтобы разобраться. Пример для HelloWorldTest не работает по той же причине.

Здесь полная запись:

Public T getActivity() С: API уровня 3 Проведите проверку активности, при необходимости запустите ее.

Для каждого вызова метода метода действие фактически не будет создано до первого вызова этого метода.

Если вы хотите предоставить настраиваемые значения настроек для своей активности, вы можете вызвать setActivityIntent (Intent) и/или setActivityInitialTouchMode (логическое значение) перед первым вызовом getActivity(). Вызов их после запуска вашей активности не будет иметь эффекта.

ПРИМЕЧАНИЕ. Действия, находящиеся под тестированием, могут не запускаться из потока пользовательского интерфейса. Если ваш тестовый метод аннотируется с помощью UiThreadTest, ваша активность будет запущена автоматически непосредственно перед запуском вашего тестового метода. Вы все еще вызываете этот метод, чтобы проверить активность.

0

Это работает правильно:

public void testGetResourceString() {
    assertNotNull(mActivity.getResources()
          .getString(com.example.pkg.R.string.testString));
}

Поскольку вы не предоставили какой-либо из своих кодов, а только строку getReousrces(), я угадаю, что вы делаете неправильно:

  • вы не используете правильный базовый класс для своего теста, используйте ActivityInstrumentationTestCase2, потому что вам нужна инфраструктура системы
  • вы используете ресурсы своего тестового проекта вместо тестируемого проекта, поэтому в моем примере идентификатор com.example.pkg.R.string.testString.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню