我有一个Android测试项目,我希望以编程方式更改方向 .
我的测试:
public class MainActivityLandscapeTest extends ActivityInstrumentationTestCase2<MainActivity> {
public MainActivityLandscapeTest() {
super(MainActivity.class);
}
private MainActivity mActivity;
private Fragment mDetailFragment;
private Fragment mListFragment;
private Solo mSolo;
@Override
protected void setUp() throws Exception {
super.setUp();
mSolo = new Solo(getInstrumentation(), getActivity());
mSolo.setActivityOrientation(Solo.LANDSCAPE);
mActivity = getActivity();
mListFragment = (Fragment) mActivity.getSupportFragmentManager()
.findFragmentById(R.id.listFragment);
mDetailFragment = (Fragment) mActivity.getSupportFragmentManager()
.findFragmentById(R.id.detailFragment);
}
public void testPreConditions() {
assertTrue(mActivity != null);
assertTrue(mSolo != null);
assertTrue(mListFragment != null);
assertTrue(getActivity().getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE);
}
/**
* Only show detailFragment in landscape mode
*/
public void testOrientation() {
assertTrue(mListFragment.isVisible());
assertTrue(mDetailFragment.isVisible());
}
}
活动的布局位于单独的文件夹,layout-port和layout-land中
-
layout-port
-
fragment_main.xml
-
布局 - 土地
-
fragment_main.xml
在横向模式下,布局包含2个片段(详细信息和列表),而在纵向中,它包含1个(仅限列表) .
如果在测试开始之前设备/仿真器已处于横向模式,则此测试通过 . 如果是纵向,则在mListFragment和mDetailFragment上失败并显示NullPointerException .
添加延迟(waitForIdleSync()和/或waitForActivity())似乎没有解决我的问题 .
如何在我的测试中强制定位到横向,同时仍然能够使用findFragmentById()找到碎片?
1 回答
问题是当使用标准的android方式查找视图/片段时,没有涉及隐式等待,所以如果它看起来精确毫秒它不存在,你得到一个空值而不是你期望的片段 . 这就是为什么通常最好使用robotiums获取视图的方法,因为他们正在等待你 . 在这种情况下,最简单的方法是添加一个命令,如
在您的代码之前设置值 . 如果你经常这样做,那么将这个方法作为必须有两行代码的方法可能是有意义的,每次必然会被遗忘!
值得注意的是,设置方向在真实设备上无法正常工作!