ActivityUnitTestCase и startActivity с ActionBarActivity

Я пытаюсь протестировать действие, которое использует ActionBarActivity (из библиотеки appcompat). Мне нужно пользовательское приложение, чтобы иметь возможность манипулировать системой DI для загрузки моего тестового сервиса вместо реального сервиса.

Если у меня написан тест и я вызываю startActivity, я получаю следующую ошибку:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

Если я вызываю launchActivityWithIntent, Activity запускается без проблем, но использует класс Real Application вместо класса Mocked Application. Любые идеи, как я могу это исправить или как я могу выполнить код после вызова onCreate приложения, но до вызова onCreate моей Activity get в моем инструментальном тесте?




Ответы (5)


Принятый ответ не сработал в моем случае, но включение чего-то в подкласс ActicityUnitTestCase сработало для меня:

@Override
public void setUp(){
    ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
    setActivityContext(context);
}
person akiraspeirs    schedule 18.05.2014
comment
Вы знаете, как заставить это работать с помощью roboelectric? - person gaara87; 17.03.2015
comment
@AkashRamani, ты понял, что такое робототехника? У меня точно такая же проблема - person user3137376; 02.08.2015

Я узнал, что если я создам собственное MockApplication и добавлю следующий код:

@Override
public void onCreate() {
    super.onCreate();
    setTheme(R.style.AppTheme);
}

Я надеюсь, что это сработает и для других людей.

person fkrauthan    schedule 28.04.2014
comment
Я столкнулся с аналогичной проблемой, но я не мог заставить ее работать. Не могли бы вы поделиться своим результатом? - person RobGThai; 01.02.2015
comment
Как я уже сказал, я создал класс, расширяющий MockApplication. Затем я перезаписал метод onCreate приведенным выше фрагментом, а затем установил экземпляр этого фиктивного класса приложения, который я создал в классе ActivityUnitTestCase. - person fkrauthan; 02.02.2015

Помните, что мы должны создавать многократно используемые действия, и, устанавливая тему в методе onCreate, мы подключаем действие к AppTheme.

На мой взгляд, ответ @Akira Speirs — лучший вариант, хотя нам нужно помнить об обновлении теста, если тема изменена в AndroidManifest.

person khmysen    schedule 10.02.2015

ActivityUnitTestCase.startActivity вызывает setActivity перед отправкой onCreate, поэтому приведенный ниже код делает свое дело:

@Override
protected void setActivity(Activity testActivity) {
    if (testActivity != null) testActivity.setTheme(R.style.AppTheme);
    super.setActivity(testActivity);
}

Это может быть альтернативой решению, предоставленному @Akira Speirs, например, если необходимо использовать пользовательский контекст.

person evgeny.myasishchev    schedule 21.03.2015

В моем случае я тестировал пользовательский компонент как часть макета.

Просто вызов getActivity().setTheme(...) в тесте setUp() сработал для меня.

Я также получал эту ошибку при тестировании на настоящее устройство.

Однако тестирование с помощью эмулятора API уровня 23 x86 с включенным HAXM работает, хорошо и быстро.

Вот более полный метод setUp() в качестве примера:

@Override
public void setUp() throws Exception {

    super.setUp();

    startActivity(new Intent(getInstrumentation().getTargetContext(), Activity.class), null, null);

    getActivity().setTheme(R.style.MyAppTheme);

    getActivity().setContentView(R.layout.my_layout_under_test);

}
person Peter Lamberg    schedule 24.09.2015