Не удалось выполнить запуск инструментария из-за «java.lang.NullPointerException»

Я пытаюсь написать модульные тестовые примеры для действий в своем приложении, расширив тестовый класс с помощью ActivityUnitTestCase. Раньше я мог успешно запускать тестовые случаи, но теперь я всегда получаю исключение при их запуске. Несмотря на то, что я хорошо знаком с обработкой NullPointerExceptions, я не мог понять, в чем проблема. Подобных вопросов не нашел, поэтому пишу этот.

Трассировка стека показывает, что в этой строке моего кода есть ссылка на нулевой объект.

activity = startActivity(mIntent, null, null);

Но метод startActivity должен получить экземпляр активности, которую я тестирую. Я не уверен, почему он возвращает ноль.

Вот трассировка стека.

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

person Prudhvi    schedule 10.08.2015    source источник
comment
@Marcin Это не просто дубликат. Я пытался отлаживать, но никаких подсказок, а также не мог найти никаких связанных вопросов. Итак, я разместил один.   -  person Prudhvi    schedule 10.08.2015
comment
Я согласен, это не простой случай NullPointerException. Исключение генерируется из цепочки вызовов класса Android ActivityUnitTestCase.   -  person Vito Andolini    schedule 11.08.2015
comment
@prudnvi Я получил такое же исключение в аналогичном тестовом примере, который я написал. Я проводил тест на устройстве Lollipop. Я только что провел тест на KitKat, и тест прошел успешно. Какой тестовый бегун вы используете? Я использую GoogleInstrumentationTestRunner. Мне интересно, нужно ли нам перейти на новый тестовый бегун: AndroidJUnitRunner, который находится в более новых версиях SDK.   -  person Vito Andolini    schedule 11.08.2015
comment
@Marcin, не могли бы вы отменить пометку как дубликат? Думаю, что уж точно нет.   -  person Vito Andolini    schedule 11.08.2015
comment
@VitoAndolini Я мог успешно запустить эти тестовые примеры в эмуляторе Nexus_5_API_22_x86 (Lollipop) с использованием AndroidJUnitRunner и без него. Но тестовые примеры терпят неудачу в эмуляторе Nexus_4_API_19 (Kitkat), а также на устройстве Samsung S6. (Оба они выдают разные исключения). S6 бросает NPE.   -  person Prudhvi    schedule 11.08.2015
comment
У меня такая же проблема. ActivityUnitTestCase проходит на всех моих устройствах, кроме Samsung S5 с Lollipop.   -  person uncle_tex    schedule 20.10.2015


Ответы (4)


@prudhvi К сожалению, я не думаю, что у меня есть серебряная пуля, но я бы посоветовал попробовать следовать эти шаги для обновления до новых библиотек поддержки тестирования в новых версиях SDK. Извините, что больше ничем помочь не могу!

person Vito Andolini    schedule 11.08.2015

Я была такая же проблема. Решение состояло в том, чтобы сделать тест ActivityInstrumentationTestCase2 вместо ActivityUnitTestCase и создать для меня активность в фоновом режиме.

person Catalin    schedule 23.10.2015

Есть большая вероятность, что что-то в вашем классе приложения (например, X расширяет приложение) дает сбой на ранней стадии. Если это так, вы увидите эту ошибку... Проверьте свой логарифм на наличие трассировок.

person steineron    schedule 26.11.2015

я изменил ActivityUnitTestCase на ActivityInstrumentationTestCase2 и удалил вызовы startActivity() (кажется, что ActivityInstrumentationTestCase2 автоматически запускает действие), теперь оно снова запускается

person wutzebaer    schedule 31.03.2016