0

私は 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()

質問は次のとおりです。

  1. solo.setActivityOrientation()を使用するときにこの例外が発生しないのに、使用すると例外が発生するのはなぜですかgetInstrumentation().callActivityOnPause(mActivity)。両方とも同じことをしていると思います。

  2. mEdtPassword.setText("")他の理由で in のようなものonPause()を別の場所でラップするrunOnUiThread必要がありますか、それともテスト目的で必要ですか?

  3. UI のテストが必要な場合は、それらを実行できるようにするために (UI スレッドで通常の操作を実行するなど) より多くのコードを記述する必要があるということですか?

明確にしていただきありがとうございます。

4

2 に答える 2

0

Praful はほぼ正しいですが、@UiThreadTest で注釈が付けられたテスト内でインストルメンテーション メソッドを使用できないと思います。これは、実際には、メイン スレッドに投稿できる実行可能ファイルにインストルメンテーション メソッドをラップすることが最善の選択肢であることを意味します。例えば:

public void callActivityOnPause(final Activity activity){
    getInstrumentation().runOnMainSync(new Runnable() {
            public void run() {
                activity.onpause();
            }
        });
}

私はこのコードを試したことがないので、おそらく間違っています。電車の中で時間をつぶしているだけです!

于 2013-02-16T18:13:17.647 に答える