Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段getActivity()在活动JUnit测试中返回null_Android_Unit Testing_Junit_Android Fragments - Fatal编程技术网

Android 片段getActivity()在活动JUnit测试中返回null

Android 片段getActivity()在活动JUnit测试中返回null,android,unit-testing,junit,android-fragments,Android,Unit Testing,Junit,Android Fragments,我为实例化片段(实际上是选项卡)的活动编写了Android JUnit测试。在测试期间,当我尝试对这些选项卡执行任何操作时,它们会崩溃,因为它们中的getActivity()方法返回null。实际的应用程序(不是测试)从不显示这种行为,片段getActivity()总是在那里返回正确的父活动。我的测试用例如下所示: public class SetupPanelTest extends ActivityUnitTestCase<MyAct> { FSetup s;

我为实例化片段(实际上是选项卡)的活动编写了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();
        }
 }
在这里,所有片段最初都是占位符,随后被实际片段替换:

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

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


即使您在事务上调用
.commit()
,它仍然没有完成,片段只是被延迟地附加

    FragmentManager m = activity.getFragmentManager();
    m.executePendingTransactions();
这最终会将所有片段附加到活动。在运行应用程序本身时似乎是多余的,但在JUnit测试用例中是必需的

<TabWidget
     android:id="@android:id/alltabs"
...
    FragmentManager m = activity.getFragmentManager();
    m.executePendingTransactions();