Android ActivityUnitTestCase和startActivity与ActionBarActivity
我尝试测试一个使用ActionBarActivity(来自appcompat库)的活动。我需要一个定制的应用程序来操作DI系统来加载我的测试服务,而不是真正的服务 如果我编写了测试并调用startActivity,则会出现以下错误:Android ActivityUnitTestCase和startActivity与ActionBarActivity,android,unit-testing,android-activity,android-actionbar,android-actionbar-compat,Android,Unit Testing,Android Activity,Android Actionbar,Android Actionbar Compat,我尝试测试一个使用ActionBarActivity(来自appcompat库)的活动。我需要一个定制的应用程序来操作DI系统来加载我的测试服务,而不是真正的服务 如果我编写了测试并调用startActivity,则会出现以下错误: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 如果我调用launchActivityWith
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
如果我调用launchActivityWithIntent,活动将毫无问题地启动,但它使用的是真实的应用程序类,而不是模拟的应用程序类。在调用onCreate of the application之后,但在仪器测试中调用onCreate of the Activity get之前,我知道如何修复该问题,或者如何执行代码吗?我发现,如果我创建一个自定义MockApplication并添加以下代码:
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
}
我希望这也适用于其他人。接受的答案在我的案例中不起作用,但在acticinyunitestcase子类中包含以下内容对我有效:
@Override
public void setUp(){
ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
setActivityContext(context);
}
记住,我们应该创建可重用的活动,通过在onCreate方法中设置主题,我们将活动连接到AppTheme
在我看来,@Akira Speirs的答案是最好的选择,尽管我们需要记住,如果AndroidManifest中的主题发生了更改,则需要更新测试。ActivityUnitTestCase.startActivity会在调度onCreate之前调用setActivity,因此下面的代码会起作用:
@Override
protected void setActivity(Activity testActivity) {
if (testActivity != null) testActivity.setTheme(R.style.AppTheme);
super.setActivity(testActivity);
}
例如,如果需要使用自定义上下文,这可能是@Akira Speirs提供的解决方案的替代方案。在我的案例中,我正在测试作为布局一部分的自定义组件 只需在测试的
setUp()
中调用getActivity().setTheme(…)
,我就可以了
在一台真正的设备上进行测试时,我也得到了
但是,使用启用了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);
}
我面临着类似的问题,但我无法让它发挥作用。你们能分享你们的结果吗?就像我说的,我创建了一个扩展MockApplication的类。然后我用上面的代码片段覆盖了onCreate方法,然后我设置了我在ActivityUnitTestCase类中创建的模拟应用程序类的一个实例。你知道如何使用RoboeElectric实现这一点吗?@AkashRamani你为RoboeElectric找到了答案吗?我也有同样的问题