CalledFromWrongThreadException, выполняющий тесты JUnit на Android - PullRequest
3 голосов
/ 18 января 2010

Я новичок в JUnit и Android, и трудно найти хорошую тестовую документацию для работы с Android.

У меня есть тестовый проект с классами, которые расширяют ActivityInstrumentationTestCase2.Простые тесты для проверки состояния графического интерфейса пользователя (что включено, относительные позиции и т. Д.) Работают должным образом.Однако, когда я пытаюсь выполнить действие нажатия кнопки, выдается неправильное исключение потока.Кто-нибудь знает, как обойти эту проблему?

В качестве дополнения, есть ли у кого-нибудь хорошие предложения по бесплатному тестированию ресурсов или TDD для Android?Я использую Eclipse / MotoDev.

Спасибо

Я могу получить различные следы отказов в зависимости от того, как я вызываю каждую кнопку, но включая один здесь для справки:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2472)
at android.view.View.playSoundEffect(View.java:8307)
at android.view.View.performClick(View.java:2363)
at com.android.tigerslair.demo1.test.GoTest.setUp(GoTest.java:49)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

Вот простая процедура setup ():

@Override
protected void setUp() throws Exception {
    super.setUp();
    TigersLair activity=getActivity();

    mGoBtn = (Button) activity.findViewById(R.id.go);
    mGoBtn.performClick();        
}

Не имеет значения, выполняю ли я щелчок в setUp () или фактический тест.

1 Ответ

7 голосов
/ 05 марта 2010

Вам необходимо выполнить все клики в UIThread.

Это можно сделать с помощью следующих двух примеров.

@UiThreadTest
public void testApp() {
  TestApp activity = getActivity();

  Button mGoBtn = (Button) activity.findViewById(R.id.testbutton);
  mGoBtn.performClick();
}

или

public void testApp2() throws Throwable {
  TestApp activity = getActivity();

  final Button mGoBtn = (Button) activity.findViewById(R.id.testbutton);
  runTestOnUiThread(new Runnable() {

    @Override
    public void run() {
      mGoBtn.performClick();
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...