1

我有一个 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());
}
}

活动的布局位于单独的文件夹中,布局端口和布局土地

  • 布局端口
    • fragment_main.xml
  • 布局土地
    • fragment_main.xml

在横向模式下,布局包含 2 个片段(详细信息和列表),而在纵向则包含 1 个(仅列表)。

如果设备/模拟器在测试开始之前已经处于横向模式,则此测试通过。如果是纵向的,它会在 mListFragment 和 mDetailFragment 上出现 NullPointerException 失败。

添加延迟(waitForIdleSync()和/或waitForActivity())似乎并没有解决我的问题。

如何在我的测试中强制方向为横向,同时仍然能够使用 findFragmentById() 找到片段?

4

1 回答 1

0

问题是当使用标准的 android 方法来查找视图/片段时,不涉及隐式等待,所以如果当它看起来精确到毫秒时它不存在,你会得到一个空值而不是你期望的片段。这就是为什么通常最好使用robotiums 方法来获取视图,因为它们正在等待你。在这种情况下,最简单的方法是添加一个命令,例如

solo.waitForFragmentById(R.id.listFragment);

在您的代码设置值之前。如果您经常这样做,那么将其作为一种方法可能是有意义的,因为每次必须有两行代码肯定会在某个时候被遗忘!

还值得注意的是,设置方向在真实设备上无法正常工作!

于 2012-12-13T22:58:55.747 回答