#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 способа протестировать проект библиотеки, вот они