【问题标题】:ActivityUnitTestCase and startActivity with ActionBarActivityActivityUnitTestCase 和 startActivity 与 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 之前执行代码?

【问题讨论】:

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


    【解决方案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);
        
        }
        

        【讨论】:

          猜你喜欢
          • 2014-09-05
          • 2014-08-25
          • 1970-01-01
          • 2011-12-23
          • 1970-01-01
          • 1970-01-01
          • 2019-07-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多