Robolectric: Wie kann ich testen, eine Tätigkeit, die enthält eine SherlockFragment?
Habe ich gelesen, viele links von hier aus, github und robolectric blog aber nicht finden konnte eine funktionierende Lösung noch (schon mit Robolectric 2.0 alpha 2).
UPDATE: Das problem auch passiert, auch wenn wir ersetzen SherlockFragment
für android.support.v4.app.Fragment
.
War ich in der Lage zu testen, ein SherlockFragmentActivity nach dieser Tipp, aber wenn ich dieses fragment, das ist eine SherlockFragment, auf meine Tätigkeit xml:
<fragment
android:name="com.marcelopazzo.fragmentapplication.ExampleFragment"
android:id="@+id/example_fragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
Den SherlockFragment Klasse:
public class ExampleFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
- Und dies ist das layout, das wird aufgeblasen durch das fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/hello_again"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_again" />
</LinearLayout>
Bekomme ich die folgende Fehlermeldung:
java.lang.NullPointerException
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:69)
at android.view.ViewGroup.addView(ViewGroup.java)
at org.robolectric.res.builder.LayoutBuilder.constructFragment(LayoutBuilder.java:150)
at org.robolectric.res.builder.LayoutBuilder.create(LayoutBuilder.java:104)
at org.robolectric.res.builder.LayoutBuilder.doInflate(LayoutBuilder.java:42)
at org.robolectric.res.builder.LayoutBuilder.doInflate(LayoutBuilder.java:45)
at org.robolectric.res.builder.LayoutBuilder.inflateView(LayoutBuilder.java:62)
at org.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:50)
at org.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:55)
at android.view.LayoutInflater.inflate(LayoutInflater.java)
at com.squareup.test.ActionBarSherlockRobolectric.setContentView(ActionBarSherlockRobolectric.java:38)
at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:262)
at com.marcelopazzo.fragmentapplication.MainActivity.onCreate(MainActivity.java:13)
at com.marcelopazzo.fragmentapplication.MainActivityTest.setUp(MainActivityTest.java:33)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:110)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:234)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:133)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:114)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:188)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:166)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:86)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:101)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)
Dies ist die test-Klasse, die ich benutze:
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
private MainActivity activity;
private TextView textView;
public static final String GREETINGS = "Hello world!";
@Before
public void setUp() {
ActionBarSherlock.registerImplementation(ActionBarSherlockRobolectric.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockNative.class);
ActionBarSherlock.unregisterImplementation(ActionBarSherlockCompat.class);
activity = new MainActivity();
activity.onCreate(null);
textView = (TextView) activity.findViewById(R.id.hello);
}
@Test
public void shouldGreet() {
assertEquals(GREETINGS, textView.getText());
}
}
Die App funktioniert einwandfrei auf dem Gerät.
Was vermisse ich hier?
ps: Der vollständige Quellcode ist verfügbar auf github
Edit: Ebenfalls getestet mit dem code von square/master (2.0 alpha 3-Platz 5) Niederlassung und habe das gleiche problem.
Die überprüfung der LayoutBuilder.constructFragment
ich denke, das problem ist, dass activity.getSupportFragmentManager().beginTransaction().add(fragment, tag).commit()
funktioniert nicht mit SherlockFragment, so fragment.getView()
ist die Rückgabe null.
Ich bin mir nicht sicher, ob ich alles machen kann an meiner Seite, dies zu beheben... bin ich schon überprüft, wenn ich es beheben kann auf robolectric Seite, bitte lassen Sie mich wissen, wenn jemand einen Tipp auf dieses.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, mit Robolectric 2.0 neue ActivityController, die behebt einige Planung/Bestellung-von-Operationen Fragen, die Häufig auftauchen.
Sie veranstaltet für die Haupt-looper, um vorübergehend angehalten werden, während der Aufruf von onCreate().
Aufrufen
rufen Sie Ihre Fragment.onCreateView-Methode
Ich bin nicht glücklich mit dieser Lösung, aber es gibt einen Weg, um es Arbeit:
Die Methode
fragment.getView()
ist die Rückgabe null, weil dieonCreateView
aus meiner Fragment wurde nie genannt. Es sollte aufgerufen werden, indem Sie die MethodemoveToState
ausandroid.support.v4.app.FragmentManager
, aber nicht, weilf.mFromLayout
falsch war.Also, wenn Sie fügen Sie diese code-block, um Ihre Fragmente
onCreate
Methode, es wird funktionieren.Wie gesagt, nicht wirklich eine Lösung, aber ein Weg, um es zu arbeiten, bevor Sie jemand findet eine passende Lösung.
[UPDATE] funktioniert Diese Methode nicht mit Robolectric 2.0 Final