Android Instrumentation Tests - UI-Thread Fragen

Ich bin versucht zu schreiben, eine Instrumentation Test für meine Android-app.

Ich in einige seltsame threading Probleme und ich kann nicht scheinen, um eine Lösung zu finden.

Meine Ursprüngliche 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")));
    }
}

Dies führte zu einer

android.Blick.ViewRootImpl$CalledFromWrongThreadException: Nur der original-thread, erstellt einen view hierarchy can touch its views.

...

com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails(WorkOrderDetails.java:155)

Die einzige Sache, die updateDetails() Methode tut, ist, einige setText() Anrufe.

Auf der Suche nach etwas, es schien, wie das hinzufügen eines UiThreadTestRule und android.support.test.annotation.UiThreadTest Anmerkung zu meinem test würde das problem zu beheben.

@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: Methode kann nicht aufgerufen werden auf der Hauptanwendungs-thread (über: Haupt)

(Hinweis: Alle Methoden, die in diesem stack-trace sind nicht mein code)

Scheint es zu sein, gibt mir gemischte Ergebnisse... Wenn es benötigt, um ausgeführt werden auf den ursprünglichen thread erstellt hat die Aussicht aber nicht ausführen können, auf dem Haupt-thread, welchen thread soll es ausgeführt werden?

Ich würde wirklich zu schätzen jede Hilfe oder Anregungen!

InformationsquelleAutor Khalos | 2016-02-03
Schreibe einen Kommentar