2010-01-18 4 views
3

Je suis nouveau à JUnit et Android et une bonne documentation de test pour travailler avec Android est difficile à trouver.CalledFromWrongThreadException s'exerçant JUnit tests sur Android

J'ai un projet de test avec des classes qui étendent ActivityInstrumentationTestCase2. Des tests simples pour examiner l'état de l'interface graphique (ce qui est activé, les positions relatives, etc.) fonctionnent comme prévu. Cependant lorsque je tente d'effectuer des actions de clic sur un bouton, l'exception de thread incorrecte est levée. Quelqu'un sait comment contourner ce problème?

Par la suite, est-ce que quelqu'un a de bonnes suggestions pour des ressources gratuites sur le test ou TDD pour Android? J'utilise Eclipse/MotoDev.

Merci

je peux obtenir différentes traces de défaillance selon la façon dont j'invoque chaque bouton, mais dont une pour référence:

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) 

Voici la routine d'installation simple():

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

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

Peu importe si j'effectue le clic dans setUp() ou le test actuel.

Répondre

7

Vous devez exécuter tous les clics dans l'UIThread.

Cela peut être fait par les deux exemples suivants.

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

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

ou

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