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