Android Instrumentation de Test - Thread d'INTERFACE utilisateur Questions

Je suis en train d'écrire une Instrumentation de Test pour mon application Android.

Je suis en cours d'exécution dans d'étranges problèmes de threading et je n'arrive pas à trouver une solution.

Mon Premier Test:

@RunWith(AndroidJUnit4.class)
public class WorkOrderDetailsTest {

    @Rule
    public ActivityTestRule<WorkOrderDetails> activityRule = new ActivityTestRule<>(WorkOrderDetails.class);

    @Test
    public void loadWorkOrder_displaysCorrectly() throws Exception {
        final WorkOrderDetails activity = activityRule.getActivity();

        WorkOrder workOrder = new WorkOrder();
        activity.updateDetails(workOrder);

        //Verify customer info is displayed
        onView(withId(R.id.customer_name))
                .check(matches(withText("John Smith")));
    }
}

Ce qui a entraîné une

android.vue.ViewRootImpl$CalledFromWrongThreadException: Seul le thread qui a créé un point de vue de la hiérarchie peut toucher son point de vue.

...

com.kwtree.kwtree.l'ordre du travail.WorkOrderDetails.updateDetails(WorkOrderDetails.java:155)

La seule chose que l' updateDetails() méthode n'est quelques setText() appels.

Après avoir cherché un peu, il semble que l'ajout d'un UiThreadTestRule et android.support.test.annotation.UiThreadTest annotation à mon test de résoudre le problème.

@UiThreadTest:

@RunWith(AndroidJUnit4.class)
public class WorkOrderDetailsTest {

    //Note: This is new
    @Rule
    public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();

    @Rule
    public ActivityTestRule<WorkOrderDetails> activityRule = new ActivityTestRule<>(WorkOrderDetails.class);

    @Test
    @UiThreadTest //Note: This is new
    public void loadWorkOrder_displaysCorrectly() throws Exception {
        final WorkOrderDetails activity = activityRule.getActivity();

        WorkOrder workOrder = new WorkOrder();
        activity.updateDetails(workOrder);

        //Verify customer info is displayed
        onView(withId(R.id.customer_name))
                .check(matches(withText("John Smith")));
    }
}

java.lang.IllegalStateException: Méthode ne peut être appelée sur le thread principal de l'application (sur: principal)

(Remarque: Toutes les méthodes dans cette trace de la pile ne sont pas de mon code)

Il semble être en me donnant des résultats mitigés... Si il doit être exécuté sur le thread d'origine qui a créé la vue, mais ne peut pas s'exécuter sur le thread principal, ce fil doit-il être géré sur?

J'apprécierais vraiment de l'aide ou des suggestions!

InformationsquelleAutor Khalos | 2016-02-03