android - 使用测试支持库销毁并重启 Activity

标签 android testing android-testing testing-support-library

在 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/

相关文章:

ruby-on-rails - 有什么方法可以使用公共(public) URL 在 Rspec 中测试文件上传吗?

ruby-on-rails - 将 cucumber 翻译成 rspec

onCreateDialog 中的 Android EditText

android - 我应该为哪个版本的 Android 开发?

java - 我想在同一个 Activity 中停止后重新启动相机源

android - chmod 失败 : EPERM (Operation not permitted) in android?

java - 如何进行非事务性 Spring 测试

android-fragments - 无法解析androidx.fragment的依赖项:fragment-testing

android - 如何生成用于模拟的 android.jar?

关于获取上下文的 Android ActivityInstrumentationTestCase2 NullPointerException