具有ActionBarActivity的ActivityUnitTestCase和startActivity

时间:2014-03-12 21:39:14

标签: android unit-testing android-activity android-actionbar android-actionbar-compat

我尝试测试一个使用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之前?

5 个答案:

答案 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);

}