我尝试测试一个使用ActionBarActivity的Activity(来自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 of my Activity之前?
答案 0 :(得分:24)
接受的答案在我的案例中没有起作用,但在ActicityUnitTestCase子类中包含的内容对我有用:
@Override
public void setUp(){
ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
setActivityContext(context);
}
答案 1 :(得分:2)
我发现如果我创建一个自定义MockApplication并添加以下代码:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
我希望这对其他人也有用。
答案 2 :(得分:0)
请记住,我们应该创建可重用的活动,并通过在onCreate方法中设置主题,我们将活动连接到AppTheme。
@Akira Speirs的答案在我看来是最好的选择,即使我们需要记得在AndroidManifest中更改主题时更新测试。
答案 3 :(得分:0)
ActivityUnitTestCase.startActivity在调度onCreate之前调用setActivity,因此下面的代码可以解决问题:
@Override
protected void setActivity(Activity testActivity) {
if (testActivity != null) testActivity.setTheme(R.style.AppTheme);
super.setActivity(testActivity);
}
这可能是@Akira Speirs提供的解决方案的替代方案,例如,如果需要使用自定义上下文。
答案 4 :(得分:0)
在我的情况下,我正在测试自定义组件作为布局的一部分。
只需在测试中调用getActivity().setTheme(...)
setUp()
为我工作。
在真实设备上进行测试时,我也得到this error。
然而,使用支持HAXM的API级别23 x86仿真器进行测试,它可以正常工作并且非常快速。
以下是一个更完整的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);
}