Gagal menjalankan Instrumentasi karena 'java.lang.NullPointerException'

Saya mencoba menulis kasus pengujian Unit untuk Aktivitas di aplikasi saya dengan memperluas kelas pengujian dengan ActivityUnitTestCase. Saya berhasil menjalankan kasus pengujian sebelumnya, tetapi sekarang saya selalu mendapatkan pengecualian saat menjalankannya. Meskipun saya cukup akrab dengan penanganan NullPointerExceptions, saya tidak dapat menemukan masalah yang menyebabkan hal ini. Saya tidak dapat menemukan pertanyaan serupa jadi saya memposting yang ini.

Pelacakan tumpukan menunjukkan kepada saya bahwa ada referensi objek nol pada baris ini dalam kode saya

activity = startActivity(mIntent, null, null);

Tetapi metode startActivity seharusnya mendapatkan instance dari aktivitas yang saya uji. Saya tidak yakin mengapa hasilnya nol.

Berikut adalah jejak Stack.

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'

Ini adalah kelas Tes

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

person Prudhvi    schedule 10.08.2015    source sumber
comment
@Marcin Ini bukan sekedar duplikat. Saya telah mencoba melakukan debug tetapi tidak ada petunjuk dan juga tidak dapat menemukan pertanyaan terkait. Jadi saya telah memposting satu.   -  person Prudhvi    schedule 10.08.2015
comment
Saya setuju, ini bukan kasus NullPointerException yang sederhana. Pengecualian dilemparkan dari dalam rantai panggilan kelas ActivityUnitTestCase Android.   -  person Vito Andolini    schedule 11.08.2015
comment
@prudnvi Saya mendapat pengecualian yang sama dalam kasus uji serupa yang saya tulis. Saya menjalankan tes pada perangkat Lollipop. Saya baru saja menjalankan pengujian di KitKat, dan pengujian tersebut berhasil. Pelari tes apa yang Anda gunakan? Saya menggunakan GoogleInstrumentationTestRunner. Saya ingin tahu apakah kami perlu meningkatkan ke test runner baru: AndroidJUnitRunner yang ada di versi SDK yang lebih baru.   -  person Vito Andolini    schedule 11.08.2015
comment
@Marcin bisakah Anda menghapus tanda ini sebagai duplikat? Menurut saya, tentu saja tidak.   -  person Vito Andolini    schedule 11.08.2015
comment
@VitoAndolini Saya berhasil menjalankan kasus pengujian ini di emulator Nexus_5_API_22_x86 (Lollipop) dengan dan tanpa menggunakan AndroidJUnitRunner. Namun kasus pengujian gagal di emulator Nexus_4_API_19 (Kitkat) dan juga pada perangkat Samsung S6. (Keduanya memberikan pengecualian yang berbeda). S6 melempar NPE.   -  person Prudhvi    schedule 11.08.2015
comment
Saya mengalami masalah yang sama. ActivityUnitTestCase diteruskan ke semua perangkat saya kecuali Samsung S5 dengan Lollipop.   -  person uncle_tex    schedule 20.10.2015


Jawaban (4)


@prudhvi Sayangnya, saya rasa saya tidak punya solusi yang tepat, tetapi saya sarankan untuk mencoba mengikuti langkah-langkah ini untuk meningkatkan versi ke pustaka dukungan pengujian baru di versi SDK yang lebih baru. Maaf saya tidak bisa membantu lebih lanjut!

person Vito Andolini    schedule 11.08.2015

Saya memiliki masalah yang sama. Solusinya adalah menjadikan pengujian sebagai ActivityInstrumentationTestCase2 alih-alih ActivityUnitTestCase, dan membuat aktivitas untuk saya di latar belakang

person Catalin    schedule 23.10.2015

Ada kemungkinan besar sesuatu di kelas aplikasi Anda (yaitu X extends Application) mogok sejak awal. Jika demikian, Anda akan melihat kesalahan ini.... Periksa jejak logcat Anda.

person steineron    schedule 26.11.2015

saya mengubah ActivityUnitTestCase menjadi ActivityInstrumentationTestCase2 dan menghapus panggilan startActivity() saya (tampaknya ActivityInstrumentationTestCase2 secara otomatis memulai aktivitas) sekarang aktivitas tersebut berjalan kembali

person wutzebaer    schedule 31.03.2016