【发布时间】:2015-03-16 20:00:55
【问题描述】:
为了在配置更改时保留我的 AsyncTasks,我使用了一个基于片段的解决方案和 setRetainInstance(true),它托管每个 AsyncTask 并回调一个监听 Activity,类似于这个解决方案 http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
最终,目的是使用 Robolectric 在整个配置更改过程中测试 AsyncTask 的保留功能,但我需要从正确设置实际配置更改开始。但是,我似乎无法模仿配置更改期间发生的确切参考行为。
真实应用:运行真实应用时,在配置更改时,Activity 被销毁并重新创建,而 Fragment 被保留,因此它似乎正在工作。我可以通过在配置更改之前和之后检查他们的参考来看到这一点(下面使用的示例参考):
真正的应用程序,之前: 活动: abc 片段: xyz
真正的应用程序,之后: 活动: bca 片段: xyz(正确保留并重新附加)
案例 1: 然而,在 Robolectric 测试中对 Activity 运行 recreate() 时,Activity 似乎没有正确地重新创建其实例(尽管文档说该方法执行所有生命周期调用):
mActivityController =
Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();
mActivity = mActivityController.get();
mActivity.recreate();
使用 recreate() 的 Robolectric,之前: 活动: abc 片段: xyz
使用 recreate() 的 Robolectric,之后 活动: abc 片段: xyz
这让我相信没有正确创建新的 Activity 实例,因此重新附加功能并没有真正发生。
案例 2: 如果我改为基于单个生命周期调用创建测试:
mActivityController = Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();
mActivityController.pause().stop().destroy();
mActivityController = Robolectric.buildActivity(AsyncTaskTestActivity.class).attach().create().start().resume().visible();
在这个版本中,Activity 似乎从头开始完全替换,但 Fragment 也是如此:
具有单独生命周期调用的 Robolectric,之前 活动: abc 片段: xyz
具有单独生命周期调用的 Robolectric,之后 活动: bca 片段: yzx
看来我要么重用同一个 Activity(案例 1),要么用新实例替换所有内容,好像没有保留 Fragment 的底层应用程序(案例 2)。
问题:有什么方法可以设置我的 Robolectric 测试来模拟我在实际 Android 环境中运行应用程序时获得的参考结果(根据真实应用程序结果),或者我是否坚持创建单独的测试应用程序或解决 Robotium 功能测试?我尝试这样做https://stackoverflow.com/a/26468296,但得到的结果与我的案例 2 相同。
提前致谢!
【问题讨论】:
-
我遇到了完全相同的问题。你找到解决方案了吗?
标签: android android-fragments android-lifecycle robolectric android-testing