web-dev-qa-db-ja.com

エスプレッソアクティビティが終了したかどうかをテストする方法?

特定のアクションが実行されると、現在テスト中のAcitivtyが終了したと断言します。残念ながら、これまでのところ、テストの最後にスリープを追加することでそれをアサートするだけです。もっと良い方法はありますか?

import Android.content.Context;
import Android.os.Build;
import Android.support.test.rule.ActivityTestRule;
import Android.test.suitebuilder.annotation.LargeTest;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import static org.junit.Assert.assertTrue;

@SuppressWarnings("unchecked")
@RunWith(JUnit4.class)
@LargeTest
public class MyActivityTest {

    Context context;

    @Rule
    public ActivityTestRule<MyActivity> activityRule
            = new ActivityTestRule(MyActivity.class, true, false);

    @Before
    public void setup() {
        super.setup();
        // ...
    }

    @Test
    public void finishAfterSomethingIsPerformed() throws Exception {

        activityRule.launchActivity(MyActivity.createIntent(context));

        doSomeTesting();

        activityRule.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                fireEventThatResultsInTheActivityToFinishItself();
            }
        });

        Thread.sleep(2000); // this is needed :(

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            assertTrue(activityRule.getActivity().isDestroyed());
        }

    }

}
23
IHeartAndroid

私の場合、isFinishing()をテストできます:

assertTrue(activityTestRule.getActivity().isFinishing());

の代わりに:

_    Thread.sleep(2000); // this is needed :(

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        assertTrue(activityRule.getActivity().isDestroyed());
    }
_

isFinishing()のもう1つの利点は、バージョンチェックが必要ないことです。

46
keineantwort

少し遅いかもしれませんが、これも可能です:

assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));
2
head01

その良い習慣かどうかはわかりませんが、これは私のために働いた:

assertTrue(mTestRule.getActivity() == null);
0
SMR

以下のStartActivityForResultサンプルを使用できます。詳細はリンクに記載されています。

FirstActivityからアクティビティを開始する方法:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

SecondActivityを終了して最初に戻る方法です(結果を送信せずに):

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

SecondActivityが終了したときにイベントを発生させる方法(FirstActivityで記述されています):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (requestCode == 1) {

   }
}//onActivityResult

詳細はこちらをご覧ください: http://developer.Android.com/training/basics/intents/result.html and and there Androidで `startActivityForResult`を管理する方法? SecondActivityから取得したいデータを送信する方法もあります。

0
kilian eller