【问题标题】:Fragment getActivity() returns null in Activity JUnit testFragment getActivity() 在 Activity JUnit 测试中返回 null
【发布时间】:2013-01-11 17:35:01
【问题描述】:

我为实例化片段(实际上是选项卡)的 Activity 编写了 Android JUnit 测试。在测试期间,当我尝试对这些选项卡执行任何操作时,它们会崩溃,因为它们中的 getActivity() 方法返回 null。实际的应用程序(不是测试)永远不会显示这种行为,并且片段 getActivity() 总是在那里返回正确的父活动。我的测试用例如下:

public class SetupPanelTest extends ActivityUnitTestCase<MyAct> {

    FSetup s;   

    public SetupPanelTest() {
    super(MyAct.class);
    }

    protected void setUp() throws Exception {
        super.setUp();
        startActivity(new Intent(), null, null);
        final MyAct act = getActivity();

        AllTabs tabs = act.getTabs();
        String tabname = act.getResources().getString(R.string.configuration);

        // This method instantiates the activity as said below
        s = (FSetup) tabs.showTab(tabname);
        FragmentManager m = act.getFragmentManager();
        // m.beginTransaction().attach(s).commit(); 
        //     ... and even this does not help when commented out

        assertTrue(s instanceof FSetup);  // Ok     
        assertEquals(act, s.getActivity()); // Failure
    }

    public void testOnPause() {
        // this crashes because s.getActivity == null;
        s.onPause();
        }
 }

AllTabs 创建一个片段,然后需要,以这种方式:

 FragmentManager manager = getFragmentManager();
 Fragment fragment = manager.findFragmentByTag(tabname);
 if (fragment == null || fragment.getActivity() == null) {
      Log.v(TAG, "Instantiating ");
      fragment = new MyFragment();
      manager.beginTransaction().replace(R.id.setup_tab, fragment, tabname).commit();
 ....

这里,所有片段最初都是占位符,后来被实际片段替换:

<FrameLayout
  android:id="@+id/setup_tab"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" />    

logcat 显示新片段已被实例化。在同一个布局中,还有前面提到的 AllTabs 片段似乎没有这个问题(否则它在哪里以及如何获取 FragmentManager):

<TabWidget
     android:id="@android:id/alltabs"
...

最令人印象深刻的是,当我直接在正确的活动上获得的片段管理器上调用附加时,这仍然没有效果。我试图延迟 5 秒(我已经读过 transaction may be delayed),我试图通过 runOnUiThread 调用其余的测试 - 没有任何帮助。

问题是需要在测试期间将我的片段附加到活动中。我有片段,我有活动,我不能将一个附加到另一个。

【问题讨论】:

    标签: android unit-testing junit android-fragments


    【解决方案1】:

    即使你在事务上调用.commit(),它仍然没有完成,片段只是懒惰地附加。

        FragmentManager m = activity.getFragmentManager();
        m.executePendingTransactions();
    

    这最终将所有片段附加到活动。在运行应用程序本身时似乎是多余的,但在 JUnit 测试用例中是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2019-05-27
      • 1970-01-01
      相关资源
      最近更新 更多