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()
不会重新启动活动.
正如@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()
.
归档时间: |
|
查看次数: |
6228 次 |
最近记录: |