ActivityInstrumentationTestCase2 и проект библиотеки Android: ресурсы не загружаются

#android #unit-testing #android-activity #project

#Android #модульное тестирование #android-активность #проект

Вопрос:

У меня следующая настройка:

  • LibProjectWithActivity — проект библиотеки Android, который содержит PreviewActivity
  • AppProject — обычный проект Android, который использует LibProjectWithActivity
  • AppProjectTest — тестовый проект Android JUnit, который является ActivityInstumentationTestCase2

Прежде всего: все основные зависимости настроены правильно, потому что я могу отлично запустить свое приложение в эмуляторе, оно показывает PreviewActivity нормально, все работает — здесь проблем нет.

Но мне не удается запустить тест… Вот настройка:

 public class PreviewActivityTest 
      extends ActivityInstrumentationTestCase2<PreviewActivity> {
    public PreviewActivityTest() {
        // note: if i put "com.the7art.libprojectwithactivity" instead it wont find it
        // and will fail with "activity not found"
        super("com.the7art.appproject", PreviewActivity.class);
    }

    public void testDummy() {
        getActivity();
    }
}
  

Это вызывает исключение NullPointerException, подобное этому:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.the7art.appproject/com.the7art.libprojectwithactivity.PreviewActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
    .......
Caused by: java.lang.NullPointerException
    at com.the7art.libprojectwithactivity.PreviewActivity.onCreate(PreviewActivity.java:37)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
    ... 11 more
  

Вот строки PreviewActivity.java:36,37:

 mButtonAdd = (Button) findViewById(R.id.button_add);
mButtonAdd.setOnClickListener(this);
  

Итак, это исключение означает, что R.id.button_add (который находится в libproject) отлично найден, но представление по этому идентификатору не может быть найдено. Если я закомментирую этот код, при попытке получить другой ресурс произойдет аналогичный сбой.

Похоже, тест использует правильные R.java, но неверный контекстный объект. Или что-то вроде этого.

Опять же, код приложения в порядке, потому что он работает в эмуляторе, что-то не так с настройкой теста…

Есть какие-либо подсказки о том, что не так и как это исправить?

Ответ №1:

Да, тест может использовать только Activity project в качестве цели, посмотрите на projectTarget в вашем тестовом файле манифеста. Это означает, что ваш тест может использовать тот же контекст, что и ваше приложение. Доступ только к ресурсам проекта приложения. Однако вы не можете получить доступ к ресурсам проекта библиотеки, вы можете использовать R.string.XX из проекта библиотеки, потому что он был создан первым, и это всего лишь сгенерированный идентификатор, который будет использоваться в контексте приложения для поиска ресурса. Таким образом, результатом будет ошибка в найденном ресурсе или исключение «ресурс не найден». Есть 2 способа протестировать проект библиотеки, вот они