ActivityUnitTestCase и startActivity с ActionBarActivity

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

@Override
public void setUp(){
    ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
    setActivityContext(context);
}

Ответ 3

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

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

Ответ 4

ActivityUnitTestCase.startActivity вызывает setActivity перед отправкой onCreate, так что код ниже делает трюк:

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

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

Ответ 5

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

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

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

Однако тестирование с помощью эмулятора уровня 23 на уровне API с 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);

}