フラグメント(実際にはタブ)をインスタンス化するアクティビティの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を通して残りのテストを呼び出そうとしました - 何も役立ちません。
質問は、テスト中にも自分のフラグメントをアクティビティに添付する必要があります。私には断片があり、私には活動があり、私は別のものを付けることができません。