2016-07-14 10 views
2

ここは私がテストしている活動です。 thread.sleepの使用が危険であると聞いてから、別の方法で書くことができたらいいですね。しかし、私はそれを許可されていません。ここでunit test - finish()、handler、threadを使用するこのコードでユニットテストが失敗するのはなぜですか?

は、このコードが何をするかです:MainActivityポーズは、数秒間、のonCreateが呼ばれたとき、それは発射Activity2

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       goToAct2(); 
      } 
     }; 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(3000); 
        handler.sendEmptyMessage(0); 

       } catch (InterruptedException e) {} 
      } 
     }).start(); 

    } 
    private void goToAct2(){ 

    Intent i = new Intent (this,Activity2.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(i); 
    finish(); 
    } 
} 

私はMainActivityが正しいアクティビティ(呼び出したかどうかをテストしたいですそれはActivity2です)。私はハンドラスレッドの一部を破棄した場合

  1. :ここではユニットテストコードは次のとおりです。

    public class MainActivityTest extends 
         ActivityInstrumentationTestCase2<MainActivity> 
    { 
    
        MainActivity activity; 
    
        public MainActivityTest() 
        { 
         super(MainActivity.class); 
        } 
    
        protected void setUp() throws Exception 
        { 
         super.setUp(); 
         activity=getActivity(); 
        } 
    
        @UiThreadTest 
        public void testOne() 
        { 
         ActivityMonitor Act2Monitor = getInstrumentation().addMonitor(Activity2.class.getName(), null, false); 
         getInstrumentation().callActivityOnCreate(activity, null);; 
         assertEquals(1, Act2Monitor.getHits()); 
        } 
    } 
    

    私がいることがわかりgoToAct2のonCreate(中直接())を呼び出す

    、それでもテストは失敗します。しかし、そのメソッドでというfinish()を削除すると、テストは合格になります。

  2. 私はハンドラスレッドの一部を保存する場合:

    はどんなに私は何をすべきか、テストでは、それがなっても、実際の活動は、働く障害が発生し続けていません。

フードの下では何が起こっていますか?また、Activity2の作成を確認できるテストを正しく作成するにはどうすればよいですか? activity2で

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

は、あなたが戻ってFirstActivityに戻したいデータを設定:アプリケーションのアクティビティコードで

+0

'assertEquals()'の前に3秒間待たなければならないのですか? – Codebender

+0

もそれを試しました。テストはまだ合格しません。 – phong

+0

'finish()'を削除して待ちましたか?わずか3秒以上待つ必要があるかもしれません。おそらく4秒。 – Codebender

答えて

0

あなたはこのような何かを持っている必要があります。

Intent returnIntent = new Intent(); 
returnIntent.putExtra("result",result); 
setResult(Activity.RESULT_OK,returnIntent); 
finish(); 

次に、メインアクティビティでonActivityResultメソッドをオーバーライドして結果を処理します。

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

    if (requestCode == 1) { 
     if(resultCode == Activity.RESULT_OK){ 
      String result=data.getStringExtra("result"); 
     } 
     else { 
      //Write your code if there's no result 
     } 
    } 
} 

最後に、あなたのテストケースにクラスActivityUnitTestCaseを使用して、彼らが呼ばれたパラメータを検査するかisFinishCalled()getFinishedActivityRequest()を呼び出します。

これのドキュメントがである:

https://developer.android.com/reference/android/test/ActivityUnitTestCase.html#isFinishCalled()

+0

私はこのアクティビティのソースコードを変更することができないので、これは私が探しているものではないと思います。 – phong

+0

でも、ActivityUnitTestCaseとisFinishCalled()メソッドを使用できるはずです。 –

+0

アクティビティ2の作成の検証には役立ちません。たぶん私は何かが恋しいです。詳細に行くことができますか? – phong

0

私は申し訳ありませんasnwerとしてこれを掲示しなければならないので、私がコメントを作成することはできません。

私が読んだところでは、finish()メソッドが呼び出された後にgetActivity()を呼び出す必要があります。

あなたがアクティビティに保存したインスタンスを照会するのは、新しいアクティビティではなく、削除されたアクティビティです。私はgetInstrumentation()を変更しようとしています。callActivityOnCreate(activity、null); getInstrumentation()に渡します。callActivityOnCreate(getActivity()、null); これにより、現在のアクティビティが返され、破棄されたアクティビティは返されません。

希望します。

関連する問題