使用测试支持库销毁并重新启动活动

Cod*_*ice 9 testing android android-testing testing-support-library

使用Android中的旧JUnit3样式测试,我可以执行以下操作来破坏并重新启动活动:

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
Run Code Online (Sandbox Code Playgroud)

如何使用新的测试支持库完成同样的事情?我可以使用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
Run Code Online (Sandbox Code Playgroud)

但是,似乎ActivityTestRule.getActivity()不会重新启动活动.

JCr*_*ket 7

正如@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,如果你这样做,这个类需要在包android.support.test.rule中访问包私有方法ActivityTestRule#finishActivity.然后在您的测试用例中,实现此规则:

@Rule
public ControlledActivityTestRule<TestFountainPreferenceActivity> actRule = new ControlledActivityTestRule<>(TestFountainPreferenceActivity.class);
Run Code Online (Sandbox Code Playgroud)

然后在您的个人测试用例中,调用actRule.finish()actRule.launchActivity()杀死并重新启动它.或者你可以打电话,actRule.relaunchActivity()如果你不需要做任何事情来杀死它并再次启动它.注意,false如果你有初始启动,你可以传递第三个参数来延迟启动活动,然后调用actRule.launchActivity()以使其运行,但你将失去对一些内置句柄的访问权限,例如#afterActivityLaunched#afterActivityFinished().