Ответ 1
Я узнал, что если я создаю пользовательскую MockApplication и добавлю следующий код:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
Я надеюсь, что это сработает и для других людей.
Я пытаюсь проверить действие, которое использует 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 моей активности вызывается в моем тесте на инструмент?
Я узнал, что если я создаю пользовательскую MockApplication и добавлю следующий код:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
Я надеюсь, что это сработает и для других людей.
Принятый ответ не работал в моем случае, но в том числе что-то из этого в подклассе ActicityUnitTestCase работал у меня:
@Override
public void setUp(){
ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
setActivityContext(context);
}
Помните, что мы должны создавать операции многократного использования и задавать тему в методе onCreate, который мы подключаем к AppTheme.
Ответ @Akira Speirs - лучший вариант, на мой взгляд, хотя нам нужно помнить об обновлении теста, если тема изменена в AndroidManifest.
ActivityUnitTestCase.startActivity вызывает setActivity перед отправкой onCreate, так что код ниже делает трюк:
@Override
protected void setActivity(Activity testActivity) {
if (testActivity != null) testActivity.setTheme(R.style.AppTheme);
super.setActivity(testActivity);
}
Это может быть альтернативой решению, предоставленному @Akira Speirs, например, если пользовательский контекст должен использоваться.
В моем случае я тестировал пользовательский компонент как часть макета.
Для меня работал только вызов 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);
}