Я пытаюсь написать контрольно-измерительный тест для своего приложения для Android.Android Instrumentation Testing - UI Проблемы с текстом
Я столкнулся с некоторыми странными проблемами с потоками, и я не могу найти решение.
Мой Оригинал Тест:
@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")));
}
}
Это привело к
android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, который создал иерархию вида может коснуться его точки зрения.
...
com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails (WorkOrderDetails.java:155)
Единственное, что метод updateDetails()
делает некоторые setText()
звонки.
После небольшого исследования, похоже, что добавление аннотации UiThreadTestRule
и android.support.test.annotation.UiThreadTest
к моему тесту поможет устранить проблему.
@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: Метод не может быть вызван на главном потоке приложения (на: магистральный)
(Примечание: Все методы в этой трассе стека не являются моим кодом)
Кажется, чтобы дать мне смешанные результаты ... Если его нужно запустить в исходном потоке, который создал представления, но не может работать в основном потоке, какой поток должен быть запущен?
Я бы очень признателен за любую помощь или предложения!
'runOnUiThread' подход работал в сочетании с' getInstrumentation() waitForIdleSync(); '.. К сожалению, подход '@ Before' не работал. Спасибо за помощь! – Khalos