Как вызвать Button.performClick в тестовом примере Android JUnit?

Я новичок в тестировании Android. Я хотел бы проверить, откроет ли нажатие кнопки соответствующее действие или нет. Я провел небольшое исследование и обнаружил, что для проверки мне нужно будет использовать ActivityManager.

Проблема в том, что я не могу заставить работать "щелкающую" часть. Я пытаюсь использовать Button.performClick () .

Изначально я просто вызвал эту функцию и получил сообщение об ошибке, что я не могу сделать это в текущем потоке. После некоторого поиска в Google я обнаружил, что мне нужно вызвать его в потоке пользовательского интерфейса, и наткнулся на метод runOnUiThread (Runnable r) .

Кнопка, которую я пытаюсь нажать, - _helloButton_ . Это получается в методе _setUp () _ . Я _assertNotNull_ проверил это, чтобы убедиться, что он там есть.

Внутри тестового метода я вызываю

mActivity.runOnUiThread(new Runnable() {
        public void run() {
            helloButton.requestFocus();
        }
    });
helloButton.performClick();

и получаю NPE в строке, вызывающей requestFocus () .

Затем я попробовал

mActivity.runOnUiThread(new Runnable() {
        public void run() {
            helloButton.performClick();
        }
    });

и все равно получил то же исключение с нулевым указателем.

В перспективе JUnit я получаю это сообщение

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details

И stackTrace выглядит так.

    08-05 19:03:11.922: ERROR/AndroidRuntime(578): Uncaught handler: thread main exiting due to uncaught exception
08-05 19:03:11.922: ERROR/AndroidRuntime(578): java.lang.NullPointerException
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at com.example.helloworldmk2.test.HelloWorldMK2Test$1.run(HelloWorldMK2Test.java:57)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at android.os.Handler.handleCallback(Handler.java:587)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at android.os.Looper.loop(Looper.java:123)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at java.lang.reflect.Method.invokeNative(Native Method)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at java.lang.reflect.Method.invoke(Method.java:521)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-05 19:03:11.922: ERROR/AndroidRuntime(578):     at dalvik.system.NativeStart.main(Native Method)

Строка 57 - это то место, где я вызов helloButton.performClick () .

Я не уверен, почему я получаю NPE; assertNotNull проходит без проблем. Если вы можете помочь мне с этой проблемой, я буду очень признателен. Заранее спасибо.

EDIT: я создаю подкласс ActivityInstrumentationTestCase2 для этого конкретного тестового класса.

EDIT2: Logcat извергает некоторые ошибки до того, как произойдет NPE.

Я вижу

08-05 20: 08: 54.702 : ERROR / AndroidRuntime (754): ERROR: ошибка подключения потока

и

08-05 20: 08: 58.642: ERROR / gralloc (52): [unregister] handle 0x3e1b28 все еще заблокирован (состояние = 40000001)

5
задан Don Spike 5 August 2011 в 20:11
поделиться