Ich versuche, einen Instrumentationstest für meine Android-App zu schreiben.Android Instrumentation Testing - Probleme mit der Benutzeroberfläche - Thread
Ich bin in einigen seltsamen Threading-Probleme und ich kann nicht scheinen, eine Lösung zu finden.
My Original 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.view.ViewRootImpl $ CalledFromWrongThreadException: Nur das Original-Thread, das eine Ansicht Hierarchie erstellt wurden, können ihren Standpunkt berühren.
...
com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails (WorkOrderDetails.java:155)
Das einzige, was die updateDetails()
Methode einige setText()
Anrufe tut, ist.
Nach ein wenig Recherche schien es, als ob ich eine UiThreadTestRule
und android.support.test.annotation.UiThreadTest
Annotation hinzufügen würde, um 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 auf der Hauptanwendungsthread bezeichnet werden (auf: main)
(Anmerkung: Alle die Methoden in diesem Stack-Trace sind nicht mein Code)
Es scheint zu gib mir gemischte Ergebnisse ... Wenn es auf dem ursprünglichen Thread ausgeführt werden muss, der die Ansichten erstellt hat, aber nicht auf dem Hauptthread ausgeführt werden kann, auf welchem Thread sollte es ausgeführt werden?
Ich würde wirklich jede Hilfe oder Vorschläge zu schätzen wissen!
Der 'runOnUiThread' Ansatz funktioniert, wenn in Kombination mit' getInstrumentation() waitForIdleSync(); '.. Der '@ Before'-Ansatz hat leider nicht funktioniert. Danke für die Hilfe! – Khalos