Sto provando a scrivere un test di strumentazione per la mia app per Android.Test di strumentazione Android - Problemi di filettatura dell'interfaccia utente
Sono in esecuzione in alcuni problemi di threading strano e non riesco a trovare una soluzione.
La mia prova originale:
@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")));
}
}
Ciò ha comportato un
android.view.ViewRootImpl $ CalledFromWrongThreadException: Solo il thread originale che ha creato una gerarchia vista può toccare i suoi panorami.
...
com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails (WorkOrderDetails.java:155)
L'unica cosa che il metodo updateDetails()
non fa altro che alcuni setText()
chiamate.
Dopo aver cercato un po ', è sembrato come aggiungere un'annotazione UiThreadTestRule
e android.support.test.annotation.UiThreadTest
al mio test per risolvere il problema.
@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: metodo non può essere chiamato sul thread principale dell'applicazione (a: principale)
(Nota: Tutti i metodi in questa traccia dello stack non sono il mio codice)
Sembra mi sta dando risultati misti ... Se ha bisogno di essere eseguito sul thread originale che ha creato le viste ma non può essere eseguito sul thread principale, su quale thread dovrebbe essere eseguito?
Apprezzerei davvero qualsiasi aiuto o suggerimento!
L'approccio 'runOnUiThread' lavorato quando combinato con' getInstrumentation() waitForIdleSync(); '.. L'approccio '@ Before' non ha funzionato purtroppo. Grazie per l'aiuto! – Khalos