Я пытаюсь написать Test Instrumentation Test для своего приложения для Android.
У меня возникают некоторые странные проблемы с потоками, и я не могу найти решение.
Мой первоначальный тест:
@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: метод нельзя вызвать в главном потоке приложения (на: main)
(Примечание. Все методы в этой трассировке стека не являются моим кодом)
Кажется, это дает мне смешанные результаты... Если его нужно запустить в исходном потоке, который создал представления, но не может работать в основном потоке, в каком потоке он должен быть запущен?
Я бы очень признателен за любую помощь или предложения!