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());
}
}

アクティビティのレイアウトは別のフォルダー、layout-port および layout-land にあります。

  • レイアウトポート
    • fragment_main.xml
  • レイアウトランド
    • fragment_main.xml

横向きモードでは、レイアウトには 2 つのフラグメント (詳細とリスト) が含まれ、縦向きモードでは 1 つ (リストのみ) が含まれます。

テストが開始される前に、デバイス/エミュレーターが既に横向きモードになっている場合、このテストは成功します。縦向きの場合、mListFragment と mDetailFragment で NullPointerException で失敗します。

遅延 (waitForIdleSync() および/または waitForActivity()) を追加しても、問題は解決しないようです。

findFragmentById() を使用してフラグメントを見つけながら、テストで方向を強制的に横向きにするにはどうすればよいですか?

4

1 に答える 1

0

問題は、ビュー/フラグメントを見つける標準的な Android の方法を使用する場合、暗黙の待機が含まれないため、正確なミリ秒に見えるときに存在しない場合、期待するフラグメントではなく null 値を取得することです。これが、ビューを取得するためのロボティウムのメソッドを使用するのが通常最善である理由です。このシナリオで最も簡単な方法は、次のようなコマンドを追加することです。

solo.waitForFragmentById(R.id.listFragment);

コードの前に値を設定します。これを頻繁に行う場合は、毎回 2 行のコードを記述しなければならないことは、ある時点で忘れられることになるため、これをメソッドにすることはおそらく理にかなっています。

また、実際のデバイスでは向きの設定が正しく機能しないことにも注意してください。

于 2012-12-13T22:58:55.747 に答える