10

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

@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

+1

Ich stimme zu, dies ist kein einfacher NullPointerException-Fall. Die Ausnahme wird aus der Aufrufkette der Android-Klasse ActivityUnitTestCase ausgelöst. –

+0

@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. –

Antwort

0

@prudhvi Ich glaube nicht, dass ich eine silberne Kugel habe, leider, aber ich würde vorschlagen, die neuen Test-Support-Bibliotheken versuchen these steps zu folgen zu aktualisieren in den neueren Versionen des SDK. Tut mir leid, dass ich nicht mehr helfen kann!

0

Ich hatte das gleiche Problem. Die Lösung war der Test ein ActivityInstrumentationTestCase2 anstelle eines ActivityUnitTestCase zu machen, und haben die Aktivität für mich im Hintergrund erstellt

0

Es gibt eine gute Chance, etwas in Ihrer Anwendungsklasse (das heißt X erweitert Application) wird frühzeitig abstürzt. Wenn das der Fall ist, werden Sie diesen Fehler sehen .... Bezahlen Sie Ihre Logcat für Spuren.

0

i geändert ActivityUnitTestCase zu ActivityInstrumentationTestCase2 und zog meine startActivity() Anrufe (scheint, dass ActivityInstrumentationTestCase2 automatisch die Aktivität gestartet wird) es jetzt läuft wieder