2013-01-11 18 views
5

フラグメント(実際にはタブ)をインスタンス化するアクティビティのAndroid JUnitテストを作成しました。テスト中、これらのタブで何かをしようとすると、getActivity()メソッドがnullを返すため、クラッシュします。実際のアプリケーション(テストではありません)はこの動作を表示せず、フラグメントgetActivity()は常に正しい親アクティビティを返します。私のテストケースは、次のようになります。AllTabsは、この方法では、必要なフラグメント、作成フラグメントgetActivity()はアクティビティ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(); 
     } 
} 

:ここ

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は、新しいフラグメントがインスタンス化されたことを示します。

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

ほとんどの印象的な、私は上の得られた断片のマネージャーに直接接続さ呼び出すとき:同じレイアウトでは、以前に(どこで、どのようにそれはそうFragmentManagerを取得します)この問題を持っていないようですAllTabsフラグメントを言及もありますこれはまだ効果がありません。私は5秒遅れて(私はtransaction may be delayedを読んだ)、私はrunOnUiThreadを通して残りのテストを呼び出そうとしました - 何も役立ちません。

質問は、テスト中にも自分のフラグメントをアクティビティに添付する必要があります。私には断片があり、私には活動があり、私は別のものを付けることができません。

答えて

9

トランザクションで.commit()を呼び出しても、それはまだ行われません。フラグメントは遅延してのみ接続されます。

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

これは、最終的にすべてのフラグメントをアクティビティに接続します。アプリケーション自体を実行するときには冗長だが、JUnitのテストケースでは必要となる。

関連する問題