2013-01-11 61 views
5

我爲Activity實例化了Android JUnit測試(實際上是tabs)。在測試期間,當我嘗試對這些選項卡執行任何操作時,它們會因爲getActivity()方法返回null而崩潰。實際應用程序(不是測試)從不顯示此行爲,並且片段getActivity()始終返回正確的父活動。我的測試情況是這樣的:片段getActivity()在Activity JUnit測試中返回null

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" 
... 

最令人印象深刻,當我在片段經理獲得呼叫直接連接正確的活動,這仍然沒有效果。我試圖延遲五秒(我讀過transaction may be delayed),我嘗試通過runOnUiThread調用剩下的測試 - 沒有任何幫助。

問題是需要這樣做,以便在測試過程中將我的片段附加到活動。我有碎片,我有活動,我不能把一個附加到另一個。

回答

9

即使你在事務上調用.commit(),它仍然沒有完成,片段只是懶惰地連接。

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

這最終將所有片段附加到活動。在運行應用程序本身時似乎是多餘的,但在JUnit測試用例中是必需的。

相關問題