我想为我的Android应用程序编写一个 Instrumentation 测试。
我遇到了一些奇怪的线程问题,似乎找不到解决方法。
我的原始测试:
@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)
(注意:此堆栈跟踪中的所有方法都不是我的代码)
看起来它给了我混合的结果......如果它需要在创建视图的原始线程上运行,但无法在主线程上运行,那么应该在哪个线程上运行?
我真的很感激任何帮助或建议!
getInstrumentation().waitForIdleSync();
结合使用时,runOnUiThread
方法可行。很遗憾,@Before
方法无法生效。感谢您的帮助! - Khalos