如何使用Espresso测试保存和恢复Android活动的状态?

时间:2015-10-03 19:31:14

标签: android android-testing android-espresso

有没有办法以编程方式测试活动的保存和恢复状态代码?我的意思是这样做:

How to test code built to save/restore Lifecycle of an Activity?但是以自动方式。

我已经测试了activity.recreate()方法,这几乎就是我正在搜索的方法,但事实上它并没有重置我的活动字段,就像我正在杀死进程一样。所以,即使我没有在onCreate方法中实现恢复,我的测试也可以通过(因为我的字段没有改变......)。

我目前正在玩Espresso v2,我想知道这是否可能通过玩InstrumentationRegistry.getInstrumentation()来实现?

3 个答案:

答案 0 :(得分:5)

解决方案是使用activity.recreate()方法但不要忘记通过等待空闲状态的断言来执行此操作。 我第一次尝试的问题是我写的测试就像:

instrumentation.runOnMainSync(new Runnable() {
    @Override
    public void run() {
        activity.recreate();
    }
});
assertThat(activityTestRule.getActivity().getXXX()).isNull();

其中XXX是一个字段,当没有实现保存/恢复状态处理时,我希望该字段为空。但事实并非如此,因为我的断言并没有等待娱乐任务完成。

所以在我的情况下,当我简单地添加一个espresso断言来完成工作时,我的问题就解决了,例如通过验证显示XXX字段的TextView是空的。

最后,由于Espresso提供的UI线程同步,我可以在我的活动保存/恢复状态缺失实现上断言的测试可以写成:

instrumentation.runOnMainSync(new Runnable() {
    @Override
    public void run() {
        activity.recreate();
    }
});
onView(withText("a string depending on XXX value")).check(doesNotExist());

请注意,建议的轮换解决方案也可以执行此任务,但是当我们只想测试活动生命周期时,它可能比activity.recreate()慢得多。在我的情况下,由于我的活动没有针对横向进行实施,因此无关紧要。

答案 1 :(得分:3)

您可以旋转屏幕并验证状态是否已正确保存和恢复。

private void rotateScreen() {
  Context context = InstrumentationRegistry.getTargetContext();
  int orientation 
    = context.getResources().getConfiguration().orientation;

  Activity activity = activityRule.getActivity();
  activity.setRequestedOrientation(
      (orientation == Configuration.ORIENTATION_PORTRAIT) ?
          ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : 
          ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

完整示例:http://blog.sqisland.com/2015/10/espresso-save-and-restore-state.html

答案 2 :(得分:0)

Android提供的测试工具现在提供了一种编写UI测试的方法,可以重新创建活动以测试保存和还原流程。请参阅Recreate the activity Android开发者文档页面中的Test your app's activities部分。从该页面获取的语法示例如下:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        val scenario = launchActivity<MyActivity>()
        scenario.recreate()
    }
}