私は Robotium でテスト中のクラスを持っています。そのonPause()
メソッドでは、 をクリアするだけEditText
です (後にデータを保存する必要はありませんonPause()
)。
だから私はテスト中のクラスにいます:
@Override
protected void onPause() {
super.onPause();
mEdtPassword.setText("");
}
とテスト方法:
public void testOnPauseOnStart() {
Activity mActivity = getActivity();
solo.typeText(0, CORRECT_PASSWORD);
getInstrumentation().callActivityOnPause(mActivity);
}
しかし、その後、エラーが発生しました:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4077)
at android.view.View.invalidate(View.java:10322)
at android.widget.TextView.invalidateRegion(TextView.java:4395)
at android.widget.TextView.invalidateCursor(TextView.java:4338)
at android.widget.TextView.spanChange(TextView.java:7186)
at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8821)
at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
at android.text.Selection.setSelection(Selection.java:76)
at android.text.Selection.setSelection(Selection.java:87)
at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
at android.widget.TextView.setText(TextView.java:3555)
at android.widget.TextView.setText(TextView.java:3425)
at android.widget.EditText.setText(EditText.java:80)
at android.widget.TextView.setText(TextView.java:3400)
at <package>.ui.CheckPasswordActivity.onPause(CheckPasswordActivity.java:182)
使用するsolo.setActivityOrientation(Solo.LANDSCAPE)
と、このエラーは発生しません。
次に、すべてをラップするmEdtPassword.setText("")
と問題ありません。runOnUiThread()
質問は次のとおりです。
solo.setActivityOrientation()
を使用するときにこの例外が発生しないのに、使用すると例外が発生するのはなぜですかgetInstrumentation().callActivityOnPause(mActivity)
。両方とも同じことをしていると思います。mEdtPassword.setText("")
他の理由で in のようなものonPause()
を別の場所でラップするrunOnUiThread
必要がありますか、それともテスト目的で必要ですか?UI のテストが必要な場合は、それらを実行できるようにするために (UI スレッドで通常の操作を実行するなど) より多くのコードを記述する必要があるということですか?
明確にしていただきありがとうございます。