FragmentActivity не может быть протестирована с помощью ActivityInstrumentationTestCase2 - PullRequest
28 голосов
/ 06 апреля 2011

У меня проблема с выполнением юнит-тестов для Android-приложений, использующих недавно выпущенный API поддержки фрагментов.Когда тест выполняется для FragmentActivity, в журнале появляется следующая ошибка, и класс не загружается.При запуске с идентичным классом, но производным от Activity, тест работает нормально.Оба класса работают правильно, как приложения!Это означает, что при простом вызове они оба отображают свой макет и работают правильноJar поддержки является частью пути сборки и включен в проект.

Проблема, с которой я столкнулся, заключается в том, что единственный способ использовать фрагменты (и поддержку pre3.0 android) - это использовать FragmentActivity, но если это исключаетавтоматизированное тестирование, тогда что хорошего в этой библиотеке.

4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440
04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification)
04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49)
04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed
04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init>
04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest;

Вот код, который я создал для демонстрации проблемы.Тестовый пример просто пытается создать экземпляр тестируемого класса:

FrameLayoutTest.java    
public class FrameLayoutTest extends
            ActivityInstrumentationTestCase2<FragmentLayoutSupport> {
        public FrameLayoutTest() {
            super(FragmentLayoutSupport.class);
        }

    public void testActivityTestCaseSetUpProperly() {
        assertNotNull("activity should be launched successfully", getActivity());
    }
}

Два класса, которые я создал, являются следующими, а frag_layout является пустым LinearLayout:

FrameLayout.java
public class FragmentLayout extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

И

FragmentLayoutSupport.java
public class FragmentLayoutSupport extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

Ответы [ 3 ]

50 голосов
/ 13 апреля 2011

Я потратил на это пол ночи и наконец нашел решение.Ключевая строка:

04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 

Проблема в том, что android-support-v4.jar, который вы используете в своем тестовом проекте, отличается от того, который используется в вашем проекте приложения.Удалите все ссылки на android-support-v4.jar из вашего тестового проекта.Затем перейдите в свойства вашего проекта приложения-> Путь сборки Java-> Порядок и экспорт и проверьте android-support-v4.jar, чтобы экспортировать его.Теперь оба проекта будут использовать одну и ту же библиотеку, и dalvik не будет жаловаться.

4 голосов
/ 05 марта 2012

Ответ Руперта от IntelliJ не дошел до меня.Я решил эту проблему, экспортировав jar, как предложено в ответе Eclipse.

Файл> Структура проекта> Модули> [выберите главное приложение]> вкладка зависимостей> установите флажок экспорта рядом с jar поддержки

IntelliJ Project Structure

3 голосов
/ 09 февраля 2012

Для всех пользователей IntelliJ, столкнувшихся с этой проблемой, эквивалентное исправление состоит в том, чтобы установить для вашей зависимости значение «Предоставлено» следующим образом:

Файл> Структура проекта> Модули> [выберите тестовое приложение]>вкладка зависимостей> выберите «Предоставлено» в раскрывающемся списке.

...