2013-08-06 14 views
6

Ich habe eine Android-Anwendung, die Fragmente verwendet und ActionBarCompat implementiert hat. Ich schrieb einfach Robolectric Test unten gezeigt:Robolectric mit Fragmenten und ActionBarCompat NullPointerException

@Test 
public void shouldNotBeNull() throws Exception { 
    MainFragment mainFragment = new MainFragment(); 
    startFragment(mainFragment); 
    assertThat(mainFragment, notNullValue()); 
    assertThat(mainFragment.getActivity(), notNullValue()); 
} 

private void startFragment(MainFragment fragment) { 
    FragmentActivity activity = new FragmentActivity(); 
    shadowOf(activity).callOnCreate(null); 
    shadowOf(activity).callOnStart(); 
    shadowOf(activity).callOnResume(); 

    FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(fragment, null); 
    fragmentTransaction.commit(); 
} 

ich folgende Ausnahme erhalten:

java.lang.NullPointerException: null 
at android.app.Activity.invalidateOptionsMenu(Activity.java:2595) 
at android.support.v4.app.ActivityCompatHoneycomb.invalidateOptionsMenu(ActivityCompatHoneycomb.java:30) 
at android.support.v4.app.FragmentActivity.supportInvalidateOptionsMenu(FragmentActivity.java:572) 
at android.support.v4.app.Fragment.setHasOptionsMenu(Fragment.java:708) 
at com.example.android.ui.MainFragment.onCreate(MainFragment.java:599) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) 
at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) 
at org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:198) 
at org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) 
at org.robolectric.shadows.ShadowHandler.post(ShadowHandler.java:51) 
at android.os.Handler.post(Handler.java) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1322) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
at com.example.android.ui.MainFragmentTest.startFragment(MainFragmentTest.java:36) 
at com.example.android.ui.MainFragmentTest.shouldNotBeNull(MainFragmentTest.java:22) 

Wenn so etwas wie dies mit:

MainActivity activity = new MainActivity(); 
shadowOf(activity).callOnCreate(null); 
shadowOf(activity).callOnStart(); 
shadowOf(activity).callOnResume(); 

wo MainActivity Halter Aktivität für MainFragment ist, ich Erhalten Sie die folgende Ausnahme:

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
at org.robolectric.res.builder.RobolectricPackageManager.getActivityInfo(RobolectricPackageManager.java:59) 
at android.support.v7.app.ActionBarActivityDelegate.getUiOptionsFromMetadata(ActionBarActivityDelegate.java:157) 
at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:53) 
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) 
at com.example.android.ui.MainActivity.onCreate(MainActivity.java:45) 
at org.robolectric.shadows.ShadowActivity.invokeReflectively(ShadowActivity.java:176) 
at org.robolectric.shadows.ShadowActivity.callOnCreate(ShadowActivity.java:121) 
at com.example.android.ui.MainFragmentTest.startFragment(MainFragmentTest.java:28) 
at com.example.android.ui.MainFragmentTest.shouldNotBeNull(MainFragmentTest.java:22) 

Ich vermute, es könnte etwas über ActionBarCompat und Robolectric nicht kompatibel sein. Jede Hilfe wäre willkommen.

+0

Was bedeutet 'shadowOf (Aktivität)' zurückkehren? – Terry

+0

Danke für die Teilnahme. Was die Methode shadowOf angeht, wird die beste auf der RoboClectric-Website angegeben: "Manchmal bieten Android-Klassen keine Methoden zum Zugriff auf den Status der zu testenden Android-Objekte. Die Robolectric.shadowOf() -Methoden stellen einen Bezug zu den Schatteninstanzen dar Android-Objekte, die es Tests erlauben, den Status zu bestätigen, ansonsten nicht verfügbar ". Wenn Sie andernfalls angenommen haben, dass shadowOf (activity) beim Debuggen null zurückgibt, dann id nicht. –

+0

Das Problem bleibt bestehen, so dass jeder Vorschlag hilfreich wäre. –

Antwort

0

Ab Robolectric 2.4 soll es die Appcompat-Bibliothek unterstützen. Es gibt jedoch ein paar Fehler, da es nicht out of the box funktioniert. Dinge, die mir geholfen haben:

  1. Erstellen einer project.properties Datei mit folgendem Inhalt

Wie in the config manual beschrieben:

target=android-19 android.library.reference.1=/../../build/intermediates/exploded-aar/com.android.support/appcompat-v7/20.0.0  
android.library.reference.2=/../../build/intermediates/exploded-aar/com.android.support/support-v4/20.0.0 
android.library.reference.3=/../../build/intermediates/exploded-aar/com.viewpagerindicator/library/2.4.1 
  1. Einstellung exculdes in build.gradle für Robolectric

Offenbar Robolectric hat seine eigenen Versionen der Support-Bibliotheken so die mögliche doppelte Abhängigkeiten zu verhindern benötigt wird folgende (bezogen von here):

androidTestCompile('org.robolectric:robolectric:2.4') { 
    exclude module: 'classworlds' 
    exclude module: 'commons-logging' 
    exclude module: 'httpclient' 
    exclude module: 'maven-artifact' 
    exclude module: 'maven-artifact-manager' 
    exclude module: 'maven-error-diagnostics' 
    exclude module: 'maven-model' 
    exclude module: 'maven-project' 
    exclude module: 'maven-settings' 
    exclude module: 'plexus-container-default' 
    exclude module: 'plexus-interpolation' 
    exclude module: 'plexus-utils' 
    exclude module: 'wagon-file' 
    exclude module: 'wagon-http-lightweight' 
    exclude module: 'wagon-provider-api' 
    exclude group: 'com.android.support', module: 'support-v4' 
    exclude group: 'com.android.support', module: 'appcompat-v7' } 
Verwandte Themen