2013-01-11 6 views
5

Ich schrieb Android JUnit Test für Aktivität, die Fragmente (tatsächlich Registerkarten) instanziiert. Während des Tests, wenn ich versuche, etwas mit diesen Tabs zu machen, stürzen sie ab, weil die Methode getActivity() in ihnen null zurückgibt. Die tatsächliche Anwendung (kein Test) zeigt dieses Verhalten niemals und das Fragment getActivity() gibt immer die rechte übergeordnete Aktivität zurück. Mein Testfall wie folgt aussieht:Fragment getActivity() gibt null in Aktivität JUnit Test

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(); 
     } 
} 

Die AllTabs ein Fragment erzeugt, dann erforderlich, auf diese Weise:

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(); 
.... 

Hier sind alle Fragmente zunächst Platzhalter, die später von den tatsächlichen Fragmente ersetzt werden:

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

Die Protokolldatei zeigt, dass das neue Fragment instanziiert wurde. Im gleichen Layout gibt es auch die bereits erwähnte AllTabs Fragment, das dieses Problem nicht haben scheint (wo und wie es nur geht FragmentManager sonst):

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

meisten eindrucksvoll, wenn ich rufe direkt anhängen auf das Fragment Manager erhalten auf die richtige Aktivität, das hat immer noch keinen Effekt. Ich habe versucht, fünf Sekunden Verzögerung (ich habe gelesen, dass transaction may be delayed), versuchte ich den Rest des Tests durch runOnUiThread aufrufen - nichts hilft.

Die Frage ist, dass dies erforderlich ist, um meine Fragmente auch während des Tests an die Aktivität anzuhängen. Ich habe ein Fragment und ich habe Aktivität, ich kann sie nicht miteinander verbinden.

Antwort

9

Selbst wenn Sie auf Transaktion aufrufen, ist es noch nicht fertig, Fragmente sind nur träge angehängt.

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

Dies schließlich alle Fragmente an die Aktivität angehängt. Scheint redundant, wenn die Anwendung selbst ausgeführt wird, aber im JUnit-Testfall erforderlich ist.

Verwandte Themen