我正在尝试为我的Android应用程序编写一个Instrumentation 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"))); }}
这导致了一个
androID.vIEw.VIEwRootImpl$CalledFromWrongThreadException: Only the original thread that created a vIEw hIErarchy can touch its vIEws.
…
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: Method cannot be called on the main application thread (on: main)
(注意:此堆栈跟踪中的所有方法都不是我的代码)
它似乎给了我混合的结果……如果它需要在创建视图但不能在主线程上运行的原始线程上运行,那么应该运行什么线程?
我真的很感激任何帮助或建议!
解决方法:
这些仪器测试在他们自己的应用程序内运行.这也意味着,它们在自己的线程中运行.
您必须将您的仪器视为与实际应用程序一起安装的内容,因此您可能的交互是“有限的”.
您需要从应用程序的UIThread / main线程调用所有视图方法,因此调用activity.updateDetails(workOrder);从您的检测线程不是应用程序主线程.这就是引发异常的原因.
你可以运行你需要在主线程上测试的代码,就像你在不同的线程中通过使用它在应用程序中调用它一样
activity.runOnUiThread(new Runnable() { public voID run() { activity.updateDetails(workOrder); }}
运行此测试应该可以正常运行.
您收到的非法状态异常似乎是因为您与规则的交互. documentation州
Note that instrumentation methods may not be used when this annotation is present.
如果您在@Before中开始/开展活动,它也应该有效.
总结以上是内存溢出为你收集整理的java – Android Instrumentation Testing – UI线程问题全部内容,希望文章能够帮你解决java – Android Instrumentation Testing – UI线程问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)