我想爲我的Android應用程序編寫測試用例測試。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:方法不能在主應用程序線程上調用(上:主)
(注:所有的在這個堆棧跟蹤方法不是我的代碼)
它似乎給我混合的結果......如果它需要在創建視圖的原始線程上運行,但不能在主線程上運行,那麼應該在哪個線程上運行?
我真的很感謝任何幫助或建議!
'runOnUiThread'方法與getInstrumentation()。waitForIdleSync();'結合使用。 「@之前」方法不幸運行。謝謝您的幫助! – Khalos