FragmentActivity не может быть протестирован с помощью ActivityInstrumentationTestCase2.

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

У меня проблема в том, что единственный способ использовать фрагменты (и поддерживать Android до версии 3.0) — это использовать 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());
    }
}

Два класса, которые я создал, выглядят следующим образом, а fragment_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);
    }
}

person securelpb    schedule 06.04.2011    source источник


Ответы (3)


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

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 не будет жаловаться.

person Alec B. Plumb    schedule 13.04.2011
comment
Это было именно так. Я видел эту строку в журнале отладки, но она меня сбила с толку. Я думал, что это говорит о том, что я использовал разные версии android-support-v4.jar, которых у меня не было. Я предполагаю, что происходит то, что сборка каждого проекта с собственной ссылкой на этот файл jar привела к созданию двух файлов dex с уникальной кодировкой. Очень сложно и приятно решить. Я был почти готов отказаться от фрагментов, поскольку они практически не поддаются проверке, если вы используете библиотеку поддержки. - person securelpb; 15.04.2011
comment
Ты спасаешь жизнь — это ставило меня в тупик целых три часа. - person tomtheguvnor; 28.10.2011
comment
Ваше имя должно быть спасателем - person Traveling Salesman; 26.11.2013

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

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

Структура проекта IntelliJ

person colabug    schedule 05.03.2012

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

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

person Rupert Bates    schedule 09.02.2012
comment
После перехода на IntelliJ 11.1 мои тесты перестали работать. Ваша подсказка помогла, спасибо. - person jki; 04.04.2012
comment
Я перепробовал все предложения на этой странице, в том числе зависимость... безуспешно. Тест активности не удается создать экземпляр тестируемой активности с помощью NoSuchMethod.... :-( - person Andrew Mackenzie; 14.10.2013