有没有办法以编程方式测试活动的保存和恢复状态代码?我的意思是这样做:
How to test code built to save/restore Lifecycle of an Activity?但是以自动方式。
我已经测试了activity.recreate()
方法,这几乎就是我正在搜索的方法,但事实上它并没有重置我的活动字段,就像我正在杀死进程一样。所以,即使我没有在onCreate
方法中实现恢复,我的测试也可以通过(因为我的字段没有改变......)。
我目前正在玩Espresso v2,我想知道这是否可能通过玩InstrumentationRegistry.getInstrumentation()
来实现?
答案 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()
}
}