12

でテスト クラスを拡張して、アプリのアクティビティのユニット テスト ケースを作成しようとしていActivityUnitTestCaseます。以前はテスト ケースを正常に実行できましたが、実行中に常に例外が発生します。の処理にはかなり慣れていますがNullPointerExceptions、これを引き起こしている問題を理解できませんでした。似たような質問がなかったので投稿させていただきます。

スタック トレースは、コードのこの行に null オブジェクト参照があることを示しています

activity = startActivity(mIntent, null, null);

しかし、startActivityメソッドは、私がテストしているアクティビティのインスタンスを取得することになっています。null を返す理由がわかりません。

これがスタックトレースです。

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'

ここにテストクラスがあります

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

4 に答える 4

0

@prudhvi 残念ながら、特効薬はないと思いますが、これらの手順に従って、SDK の新しいバージョンの新しいテスト サポート ライブラリにアップグレードすることをお勧めします。これ以上お役に立てず申し訳ありません!

于 2015-08-11T04:19:08.183 に答える
0

ActivityUnitTestCaseActivityInstrumentationTestCase2に変更し、 startActivity()呼び出しを削除しました ( ActivityInstrumentationTestCase2 がアクティビティを自動的に開始するようです)。

于 2016-03-31T12:18:24.930 に答える