2011-08-03 47 views
4

一個相當正常的情況:Android應用程序具有首選項活動,並且從ListPreference中選擇選項會觸發代碼以更改該ListPreference的摘要文本。即:從ListPreference顏色選擇「綠色」將通過回調onPreferenceChange將ListPreference的摘要文本更改爲「綠色」。首選項的Android JUnit測試

我希望能夠使用Android JUnit測試來確認這些摘要更改全部正確執行。然而,似乎沒有關於如何做到這一點的信息。

我試過在ListPreference上使用setValue()的變體,無論是在測試線程還是通過runOnUiThread(),都沒有成功 - 這不會觸發對onPreferenceChange()的調用。撥打setValue()後,我也試過getInstrumentation().waitForIdleSync(),但這也沒有成功。

所以,我的問題是:這是如何完成的?

謝謝!

回答

4

幾個小時的工作產生了這個工作解決方案,但我很好奇,如果其他人有更好的解決方案。這段代碼的靈感來自this solution到類似的問題,但這種情況下,有兩種不同的方式:

  1. 它適用於搭載Android JUnit的,這意味着它需要調用ListPreference UI通過runOnUiThread()點擊使用。
  2. 它預計會有偏好類別在使用,這使查找位置(相對於整個偏好列表)變得複雜。上述解決方案僅適用於沒有偏好類別的情況。

該方法將接受特定ListPreference項目的關鍵字,以及要點擊的項目在列表中的位置。然後它會執行該列表項目單擊,其他代碼將執行我正在查找的檢查。

請注意,這需要在setUp()方法中調用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