在 Android 中使用旧的 JUnit3 样式测试,我可以执行以下操作来销毁并重新启动 Activity :
Instrumentation inst = getInstrumentation();
Activity activity = inst.getActivity();
// do something
activity.finish();
Assert.assertTrue(this.activity.isFinishing());
activity = inst.getActivity();
// assert that activity's state is restored
如何使用新的测试支持库完成同样的事情?我可以使用 Espresso 和/或 UI Automator 或新库提供的任何其他机制。
更新:
我尝试了以下方法:
Activity activity = activityTestRule.getActivity();
// do something
activity.finish();
Assert.assertTrue(this.activity.isFinishing());
activity = activityTestRule.getActivity();
// assert that activity's state is restored
但是,ActivityTestRule.getActivity()
似乎没有重新启动 Activity 。
最佳答案
正如@CommonsWare 提到的,自定义规则非常有用。这是我的简单解决方案(可以进行许多改进,但这只是一个可以构建的快速框架):
public class ControlledActivityTestRule<T extends Activity> extends ActivityTestRule<T> {
public ControlledActivityTestRule(Class<T> activityClass) {
super(activityClass, false);
}
public ControlledActivityTestRule(Class<T> activityClass, boolean initialTouchMode) {
super(activityClass, initialTouchMode, true);
}
public ControlledActivityTestRule(Class<T> activityClass, boolean initialTouchMode, boolean launchActivity) {
super(activityClass, initialTouchMode, launchActivity);
}
public void finish() {
finishActivity();
}
public void relaunchActivity() {
finishActivity();
launchActivity();
}
public void launchActivity() {
launchActivity(getActivityIntent());
}
}
注意,如果你这样做,这个类需要在包android.support.test.rule
中才能访问包私有(private)方法ActivityTestRule#finishActivity
.然后在您的测试用例中,实现此规则:
@Rule
public ControlledActivityTestRule<TestFountainPreferenceActivity> actRule = new ControlledActivityTestRule<>(TestFountainPreferenceActivity.class);
然后在您的个人测试用例中,调用 actRule.finish()
和 actRule.launchActivity()
终止并重新启动它。或者,如果您在终止它和重新启动它之间不需要做任何事情,您可以调用 actRule.relaunchActivity()
。注意,如果你有初始启动,你可以传递第三个参数false
来延迟启动activity,然后调用actRule.launchActivity()
让它运行,但是你会对一些内置句柄的松散访问,例如 #afterActivityLaunched
和 #afterActivityFinished()
。
关于android - 使用测试支持库销毁并重启 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35306423/