私は自分の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の結果:その景色に触れることができるビュー階層を作成しただけ元のスレッド。
...
updateDetails()
方法はありませんcom.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails(WorkOrderDetails.java:155)
唯一のことは、いくつかの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'のアプローチが働いていたwaitForIdleSync(); '。。 '@ Before'アプローチは残念ながらうまくいきませんでした。助けてくれてありがとう! – Khalos