2011-08-03 22 views
4

通常のシナリオ:Androidアプリケーションには環境設定アクティビティがあり、ListPreferenceからオプションを選択すると、そのListPreferenceの要約テキストが変更されます。すなわち、色のListPreferenceから "Green"を選択すると、onPreferenceChangeコールバックを介してListPreferenceの要約テキストが "Green"に変更されます。Android JUnitの環境設定のテスト

Android JUnitのテストを使用して、これらのサマリー変更がすべて正しく実行されていることを確認したいと考えています。しかし、これを行う方法については、そこにはほとんど情報がないようです。

ListPreferenceにsetValue()を使用して、テストスレッドでもrunOnUiThread()でも、バリエーションを試してみましたが、これはonPreferenceChange()の呼び出しをトリガーしません。私もsetValue()を呼び出した後にgetInstrumentation().waitForIdleSync()を試しましたが、これも成功しません。

だから、私の質問です:これはどのように行われますか?

ありがとうございます!

答えて

4

この作業ソリューションは数時間で作成できましたが、他の誰かがより良いソリューションを持っているのであれば私は不思議です。このコードは、同様の質問にはthis solutionに触発さが、この場合は、2つの方法で異なっていた。

  1. それはそれはrunOnUiThread()経由ListPreference UIクリックを呼び出す必要があります意味のAndroidのJUnitによる使用を意図しています。
  2. これは、使用中のプリファレンスカテゴリがあると予想されるため、クリックする位置(プリファレンスリスト全体を基準にして)を見つけるのが難しくなります。上記の解決策は、優先カテゴリなしの場合にのみ機能します。

このメソッドは、特定のListPreferenceアイテムのキーと、クリックするリスト内のアイテムの位置を受け入れます。次に、そのリスト項目のクリックを実行し、他のコードが私が探しているチェックを行います。

メソッドのgetActivity()コールより先にsetActivityInitialTouchMode(true);を設定する必要があることに注意してください。

private void clickListPreference(String _listPreferenceKey, int _listItemPos){ 
    final String listPreferenceKey = _listPreferenceKey; 
    final int listItemPos = _listItemPos; 

    mActivity.runOnUiThread(
      new Runnable() { 
       public void run() { 
        // get a handle to the particular ListPreference 
        ListPreference listPreference= (ListPreference) mActivity.findPreference(listPreferenceKey); 

        // bring up the dialog box 
        mActivity.getPreferenceScreen().onItemClick(null, null, getPreferencePosition(), 0); 

        // click the requested item 
        AlertDialog listDialog = (AlertDialog) listPreference.getDialog(); 
        ListView listView = listDialog.getListView(); 
        listView.performItemClick(listView, listItemPos, 0); 
       } 

       /*** 
       * Finding a ListPreference is difficult when Preference Categories are involved, 
       * as the category header itself counts as a position in the preferences screen 
       * list. 
       * 
       * This method iterates over the preference items inside preference categories 
       * to find the ListPreference that is wanted. 
       * 
       * @return The position of the ListPreference relative to the entire preferences screen list 
       */ 
       private int getPreferencePosition(){ 
        int counter = 0; 
        PreferenceScreen screen = mActivity.getPreferenceScreen(); 

        // loop over categories 
        for (int i = 0; i < screen.getPreferenceCount(); i++){ 
         PreferenceCategory cat = (PreferenceCategory) screen.getPreference(i); 
         counter++; 

         // loop over category items 
         for (int j = 0; j < cat.getPreferenceCount(); j++){ 
          if (cat.getPreference(j).getKey().contentEquals(listPreferenceKey)){ 
           return counter; 
          } 
          counter++; 
         } 
        } 
        return 0; // did not match 
       } 
      } 
    ); 

    getInstrumentation().waitForIdleSync(); 
} 
+0

このコードは、findPreference()メソッドが廃止されているため、現代のフラグメントベースのプリファレンスアクティビティでは機能していないようです。コードを新しい設定アーキテクチャに移行しようとしましたか? – saurav