ここは私がテストしている活動です。 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です)。私はハンドラスレッドの一部を破棄した場合
:ここではユニットテストコードは次のとおりです。
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()を削除すると、テストは合格になります。
私はハンドラスレッドの一部を保存する場合:
はどんなに私は何をすべきか、テストでは、それがなっても、実際の活動は、働く障害が発生し続けていません。
フードの下では何が起こっていますか?また、Activity2の作成を確認できるテストを正しく作成するにはどうすればよいですか? activity2で
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
は、あなたが戻ってFirstActivityに戻したいデータを設定:アプリケーションのアクティビティコードで
'assertEquals()'の前に3秒間待たなければならないのですか? – Codebender
もそれを試しました。テストはまだ合格しません。 – phong
'finish()'を削除して待ちましたか?わずか3秒以上待つ必要があるかもしれません。おそらく4秒。 – Codebender