ActivityUnitTestCase 和 startActivity 与 ActionBarActivity

Posted

技术标签:

【中文标题】ActivityUnitTestCase 和 startActivity 与 ActionBarActivity【英文标题】:ActivityUnitTestCase and startActivity with ActionBarActivity 【发布时间】:2014-04-17 08:23:36 【问题描述】:

我尝试测试一个使用 ActionBarActivity(来自 appcompat 库)的 Activity。我需要一个自定义应用程序,以便能够操纵 DI 系统来加载我的测试服务而不是实际服务。

如果我编写了测试并调用 startActivity,我会收到以下错误:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

如果我调用launchActivityWithIntent Activity 启动没有任何问题,但它使用的是我的真实应用程序类而不是模拟应用程序类。有什么想法可以解决这个问题,或者如何在调用应用程序的 onCreate 之后但在我的仪器测试中调用我的 Activity 的 onCreate 之前执行代码?

【问题讨论】:

【参考方案1】:

接受的答案在我的情况下不起作用,但在 ActicityUnitTestCase 子类中包含一些对我有用的东西:

@Override
public void setUp()
    ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme);
    setActivityContext(context);

【讨论】:

你知道如何使用 roboelectric 来完成这项工作吗? @AkashRamani 你为 roboelectric 想出来了吗?我有同样的问题【参考方案2】:

我发现如果我创建一个自定义的 MockApplication 并添加以下代码:

@Override
public void onCreate() 
    super.onCreate();
    setTheme(R.style.AppTheme);

我希望这也适用于其他人。

【讨论】:

我遇到了类似的问题,但我无法让它工作。你能分享一下你的结果吗? 就像我说的,我创建了一个扩展 MockApplication 的类。然后我用上面的 sn-p 覆盖了 onCreate 方法,然后设置了我在 ActivityUnitTestCase 类中创建的模拟应用程序类的实例【参考方案3】:

请记住,我们应该创建可重用的活动,并通过在 onCreate 方法中设置主题,我们将活动连接到 AppTheme。

在我看来,@Akira Speirs 的答案是最好的选择,即使我们需要记住如果 androidManifest 中的主题发生更改,我们需要更新测试。

【讨论】:

【参考方案4】:

ActivityUnitTestCase.startActivity 在调度 onCreate 之前调用 setActivity,所以下面的代码可以解决问题:

@Override
protected void setActivity(Activity testActivity) 
    if (testActivity != null) testActivity.setTheme(R.style.AppTheme);
    super.setActivity(testActivity);

这可以替代@Akira Speirs 提供的解决方案,例如,如果需要使用自定义上下文。

【讨论】:

【参考方案5】:

在我的例子中,我正在测试一个自定义组件作为布局的一部分。

在测试的setUp() 中调用getActivity().setTheme(...) 对我有用。

在真实设备上进行测试时,我也收到了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);


【讨论】:

以上是关于ActivityUnitTestCase 和 startActivity 与 ActionBarActivity的主要内容,如果未能解决你的问题,请参考以下文章

Android - ActivityUnitTestCase 测试类中 startActivity 方法上的 AssertionFailedError

为什么Android测试运行器报告“空测试套件”?

JTAG和ST-LINK的区别?

ST-LINK/V2是怎么和STM32单片机连接的

为啥我的基于 postgis ST_Intersects 和 ST_Azimuth 的查询很慢?

ST-LINK/V2是怎么和STM32单片机连接的