2016-03-08 16 views
15

私が現在テスト中のアシティビティーは、特定のアクションが実行されたときに終了すると主張したいと思います。残念ながらこれまでのところ、私はテストの最後に睡眠を追加することによってそれを主張するだけです。より良い方法がありますか?エスプレッソアクティビティが終了したかどうかをテストするには?

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()); 
     } 

    } 

} 

答えて

0

以下の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とそこにHow to manage `startActivityForResult` on Android? SecondActivityから取得したいデータを送信する方法もあります。

+0

感謝。私は十分にはっきりしていなかったと思う。私の問題は、私に第二の活動または第一の活動がないことです。私は一つのアクティビティしか持っていません。だから私はあなたがそこからテストしたいActivtiyを起動できるようにダミーの最初のアクティビティを開始する場合に限り、あなたのソリューションを使用することができます。 – IHeartAndroid

+0

あなたはあなたのrunnableを持っていて、 –

+0

fireEventThatResultsInTheActivityToFinishItself();の後に自分のアクティビティが閉じられていることを確認します。 – IHeartAndroid

28

私の場合は、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()のもう一つの利点は、あなたがバージョンチェックを必要としないこと、です。

+0

isFinishing()を使っているのはいいですが、あなたはスリープを回避する方法の質問の要点には触れていません。 –

+0

私の理解では、OPはより良いアサート方法を求めていたので、彼は 'Thread.sleep'を避けることができます。 – keineantwort

+1

私はあなたのコードをテストした後に 'Thread.sleep()'を避けることができることに気付きました。しかし、あなたはそのことを忘れてしまったので、ポイントをより明確にするために答えを編集しました。 –

0

わからないその良い練習すれば、これは私の仕事:あなたの応答のための

assertTrue(mTestRule.getActivity() == null); 
関連する問題