Подтвердить что ты не робот

FragmentActivity не может быть протестирован через ActivityInstrumentationTestCase2

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

Проблема заключается в том, что единственным способом использования фрагментов (и поддержки 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());
    }
}

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

Ответ 1

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

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

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

Ответ 2

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

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

IntelliJ Project Structure

Ответ 3

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

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