我有一个ActivityInstrumentationTestCase2
,其中包含执行 Button.click() 的测试。该按钮应启动其他活动以执行某些工作。我认为 Button.performClick() 执行正确,但测试在执行其他活动之前完成。
@UiThreadTest
public void test() {
Intent i = new Intent(this.myActivity, MyActivity.class);
myActivity.startActivity(i);
Button button = (Button) myActivity.findViewById(R.id.button);
button.performClick();
}
我尝试了以下有效的方法,但我认为这是一个解决方法,而不是一个好的解决方案。
public void test() {
Intent i = new Intent(this.myActivity, MyActivity.class);
myActivity.startActivity(i);
Button button = (Button) myActivity.findViewById(R.id.button);
button.performClick();
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
Log.e("MyTest", e.getMessage());
}
}
难道没有更好的方法吗?
这是我
的最终解决方案:
public void test() {
Instrumentation instrumentation = getInstrumentation();
// Prepare a monitor for your activity
Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(MyActivity.class.getName(), null, false);
// Start your activity manually
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(instrumentation.getTargetContext(), MyActivity.class.getName());
instrumentation.startActivitySync(intent);
Activity myActivity = getInstrumentation().waitForMonitor(monitor);
Button upSend = (Button) myActivity.findViewById(R.id.button);
upSend.performClick();
Log.d("MyTest", "button clicked");
//wait for SecondActivity to start (called by MyActivity)
monitor = instrumentation.addMonitor(SecondActivity.class.getName(), null, false);
Activity secondActivity = getInstrumentation().waitForMonitor(monitor);
int count = 0;
//wait until SecondActivity is finishing
while(!secondActivity.isFinishing()) {
Log.d("MyTest", "waiting - " + ++count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.e("MyTest",e.getMessage());
}
}
}
再次感谢埃里克;现在第二个活动通过按钮启动,测试正在等待它完成。