Ich versuche Unit-Testfälle für Aktivitäten in meiner App zu schreiben, indem ich die Testklasse um ActivityUnitTestCase
erweitere. Ich konnte die Testfälle früher erfolgreich ausführen, aber jetzt bekomme ich immer die Ausnahme, während ich sie ausführe. Obwohl ich mit der Handhabung von NullPointerExceptions
ziemlich vertraut bin, konnte ich das Problem, das das verursacht, nicht herausfinden. Ich konnte keine ähnlichen Fragen finden, also poste ich diese.Die Ausführung der Instrumentierung ist aufgrund von 'java.lang.NullPointerException' fehlgeschlagen.
Stapelüberwachung zeigt mir gibt es eine Null-Objekt Bezug auf diese Linie in meinem Code
activity = startActivity(mIntent, null, null);
Aber die startActivity
Methode soll die Instanz der Aktivität bekommen Ich teste. Ich bin mir nicht sicher, warum es null zurückgibt.
Hier ist die Stack-Spur.
java.lang.NullPointerException: Attempt to write to field 'android.os.IBinder android.app.ActivityThread.mLastIntendedActivityToken' on a null object reference
at android.app.Activity.performCreate(Activity.java:6372)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:158)
at com.abc.test.MainActivityTest.access$100(MainActivityTest.java:16)
at com.abc.test.MainActivityTest$1.run(MainActivityTest.java:34)
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1891)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Test running failed: Instrumentation run failed due to 'java.lang.NullPointerException'
Hier ist die Testklasse
public class MainActivityTest extends ActivityUnitTestCase<MainActivity>{
private Intent mIntent;
private MainActivity activity;
public MainActivityTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
//Create an intent to launch target Activity as it is not automatically started by Android Instrumentation
mIntent = new Intent(getInstrumentation().getContext(), MainActivity.class);
//Start the activity under test in isolation, in the main thread to avoid assertion error.
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
activity = startActivity(mIntent, null, null);
}
});
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Tests the preconditions of this test fixture.
*/
@SmallTest
public void testPreconditions() {
assertNotNull("MainActivity is null", getActivity());
}
@MediumTest
public void testSecondActivityWasLaunchedWithIntent() {
// Get the intent for the next started activity
final Intent launchIntent = getStartedActivityIntent();
//Verify the intent was not null.
assertNotNull("Intent was null", launchIntent);
//Verify that LaunchActivity was finished
assertTrue(isFinishCalled());
}
}
@Marcin Dies ist nicht nur ein Duplikat. Ich habe versucht zu debuggen aber keine Hinweise und konnte auch keine verwandten Fragen finden. Also habe ich einen gepostet. – Prudhvi
Ich stimme zu, dies ist kein einfacher NullPointerException-Fall. Die Ausnahme wird aus der Aufrufkette der Android-Klasse ActivityUnitTestCase ausgelöst. –
@prudnvi Ich habe die gleiche Ausnahme in einem ähnlichen Testfall, den ich schrieb. Ich habe den Test auf einem Lollipop-Gerät ausgeführt. Ich habe gerade KitKat getestet und der Test lief erfolgreich. Welchen Testläufer verwendest du? Ich verwende GoogleInstrumentationTestRunner. Ich frage mich, ob wir auf den neuen Test Runner aktualisieren müssen: AndroidJUnitRunner, der in neueren Versionen des SDK ist. –