Android ActivityUnitTestCase和startActivity与ActionBarActivity

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

我尝试测试一个使用ActionBarActivity(来自appcompat库)的活动。我需要一个定制的应用程序来操作DI系统来加载我的测试服务,而不是真正的服务

如果我编写了测试并调用startActivity,则会出现以下错误:

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找到了答案吗?我也有同样的问题